template <typename M, typename... Args>
std::shared_ptr<M> create(Args... args)
{
return std::make_shared<M>(args...);
}
还有一个简单的容器:
struct Group {
std::vector<int> vec;
Group(std::initializer_list<int> il) : vec(il) {}
};
然后我尝试创建一个群组
int main()
{
auto gr = create<Group>({1, 2, 3});
return 0;
}
这段代码无法编译,
error: no matching function for call to 'create'
auto gr = create<Group>({1, 2, 3});
candidate function not viable: requires 0 arguments, but 1 was provided
std::shared_ptr<M> create(Args... args)
^
但如果我使用一个临时变量:
int main(int argc, char *argv[])
{
std::initializer_list<int> il = {1, 2, 3};
auto gr = create<Group>(il);
return 0;
}
它确实可以。为什么呢?
针对这种情况,建议采取哪种解决方案?
{ 1,2,3 }
传递给create()
函数时,编译器实际上不知道该怎么处理:它需要确定一个合适的类型,但是没有关于应该是什么类型的指导。如果你使用了std :: initializer_list {1,2,3}
或者重载了create()
以接收std :: initailizer_list <T>
(其中T
是模板参数),那么它应该可以工作。 - Dietmar Kühl