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

Visual Studio gives error about ambiguous ctor

本文关键字:模糊 actor 错误 于模糊 Studio Visual      更新时间:2023-10-16

我被困在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没有给出歧义错误,因此看起来应该是可能的

似乎是MS vc++ 2013编译器的错误。

根据c++标准(13.3.1.7 Initialization by list-initialization, p.#1)

—最初,候选函数是初始化列表类T的构造函数(8.5.4)和实参列表由作为单个参数的初始化列表。

-如果没有找到可行的初始化列表构造函数,则重载再次执行解析,其中所有候选函数都是类T的构造函数和实参列表由初始化列表的元素。

当在你的类中找到这样的构造函数时,它将被调用。

至少这个代码是用GCC编译的。

你可以写一个缺陷报告给微软。通常他们会提出一个解决问题的方法。不要忘记测试为项目设置MS语言扩展的代码。

尝试在其他构造函数中使用std::size_t

如果你把size_t作为你的vector模板参数,你会在同一条船上…但在此问题解决之前,这是其他情况下的一种变通方法。

#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
}