Visual Studio给出了关于模糊ctor的错误

时间:2014-08-01 21:17:37

标签: c++ visual-c++ visual-studio-2013

我在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不会出现歧义错误,因此看起来应该是可能的。

2 个答案:

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