我知道之前也曾问过类似的问题。但是,我不明白为什么这是模棱两可的。
我正在制作一个类foo
,并且想给它一个向量或多个值。但是我的编译器不喜欢它。为什么会这样?
#include <vector>
template <class T>
class foo
{
public:
foo(std::vector<int> dims) { }
foo(int s1, int s2) { }
};
int main(int argc, char **argv)
{
foo<double> x({7,3});
return 0;
}
答案 0 :(得分:0)
因为您的类具有编译器生成的复制/移动构造函数。
所以您有重复项
foo(const foo&) // foo can be constructed by {7,3}
foo(vector<int>) // vector<int> can be constructed by {7,3}
也许您正在尝试做list initialization,但是语法不正确。
没有T object({arg1, arg2, ...})
但是,如果您使用foo x{7,3}
(与T object{arg1, arg2, ...}
匹配),它将起作用并调用foo(int,int)
。
顺便说一句,您应该学习并始终阅读错误,至少在Wandbox上,错误很明显
错误:重载的'foo()'的调用不明确...
注意:候选人:'foo :: foo(std :: vector)'
注意:候选人:“ constexpr foo :: foo(const foo&)”
注意:候选人:'constexpr foo :: foo(foo &&)'
清楚清楚地显示了它认为是候选的内容。
答案 1 :(得分:0)
问题是您没有明确告诉编译器您要在此处调用的那个。如果要调用传递的构造函数作为向量,则需要明确告知编译器。 您可以使用直接列表初始化:
foo<int> x(std::vector<int>{ 7,3 });