重载类构造函数的C ++调用不明确

时间:2018-09-25 02:01:24

标签: c++ overloading

我知道之前也曾问过类似的问题。但是,我不明白为什么这是模棱两可的。

我正在制作一个类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;
}

2 个答案:

答案 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 });