我在VS 2013中遇到了编译器错误,我的自定义类存在歧义错误,但它对std::vector
#include <initializer_list>
#include <vector>
using namespace std;
class MyArray
{
public:
std::vector< int > values;
MyArray(int s) : values(s) { }
MyArray(std::initializer_list< int >list) { values = list; }
};
int main ()
{
vector<int> vx({9,8,7}); // Works
MyArray mx({9, 8, 7}); // Works
vector<int> vy({9}); // Works
MyArray my({9}); // VS-compiler complains about ambiguity
MyArray mz(std::initializer_list<int>{9}); // Works
}
当然,我可以通过明确添加类型来修复歧义:MyArray my(std::initializer_list<int>{9})
,但这非常不方便。 有没有办法对构造函数进行编码,以便VS不会抱怨我的课程含糊不清?
由于std::vector
不会出现歧义错误,因此看起来应该是可能的。
答案 0 :(得分:4)
它似乎是MS VC ++ 2013编译器的一个错误。
根据C ++标准(13.3.1.7按列表初始化初始化,第1页)
- 最初,候选函数是初始化列表 类T的构造函数(8.5.4)和参数列表由 初始化列表作为单个参数。
- 如果找不到可行的初始化列表构造函数,则重载 再次执行分辨率,其中候选函数都是 类T的构造函数和参数列表由 初始化列表的元素。
因为在你的班级中找到了这样的构造函数,它将被调用。
至少这段代码是用GCC编译的。
您可以向Microsoft写一份缺陷报告。通常他们建议一种克服这个问题的方法。 不要忘记测试项目的MS语言扩展的代码设置。
答案 1 :(得分:2)
尝试在其他构造函数中使用std :: size_t
如果你将size_t作为矢量模板参数,你就会在同一条船上...但是在修复之前,这是其他情况的解决方法。
#include <initializer_list>
#include <vector>
using namespace std;
class MyArray
{
public:
std::vector< int > values;
MyArray(std::size_t s) : values(s) { }
MyArray(std::initializer_list<int> list): values(list)
{}
};
int main()
{
int s({ 9 });
vector<int> vx({ 9, 8, 7 }); // Works
MyArray mx({ 9, 8, 7 }); // Works
vector<int> vy({ 9 }); // Works
MyArray my1(0);
MyArray my({ 9 }); // VS-compiler complains about ambiguity
}