Visual Studio 给出关于模棱两可 ctor 的错误

Posted

技术标签:

【中文标题】Visual Studio 给出关于模棱两可 ctor 的错误【英文标题】:Visual Studio gives error about ambiguous ctor 【发布时间】:2014-08-01 21:17:37 【问题描述】:

我在 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&lt;int&gt;9),但这很不方便。 有没有办法对构造函数进行编码,以便 VS 不会抱怨我的类有歧义?

由于std::vector 没有给出歧义错误,所以看起来应该是可能的。

【问题讨论】:

这绝对是一个错误。如果您不使用括号,MSVC 会很高兴 - MyArray my9; 不,这将调用整数 ctor(设置大小),而不是按预期通过初始化列表设置内容。 不,它没有。它调用initializer_list 构造函数(应该如此)并将values 向量初始化为包含9 的单个元素 我的立场是正确的。这实际上可以解决我整个代码库的实际问题。 由于在 C++11 中编写 int x = 5 ; 是完全合法的,看来 VS 编译器和我一样对 c++11 感到困惑 ;) 9 可能是一个初始化器列表作为一个 "uniform initializer" 的 int。 【参考方案1】:

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

根据 C++ 标准(13.3.1.7 通过列表初始化进行初始化,p.#1)

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

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

由于在您的类中找到了这样的构造函数,因此应该调用它。

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

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

【讨论】:

【参考方案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

【讨论】:

以上是关于Visual Studio 给出关于模棱两可 ctor 的错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010多线程编程

Visual Studio 中的模板化函数指针数组

Visual Studio 代码快捷键

Visual Studio 2008 数据库项目部署基线

关于Visual studio出现错误的问题!!!

关于visual studio 2010的问题