【问题标题】:Visual Studio gives error about ambiguous ctorVisual Studio 给出关于模棱两可 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 my{9};
  • 不,这将调用整数 ctor(设置大小),而不是按预期通过初始化列表设置内容。
  • 不,它没有。它调用initializer_list 构造函数(应该如此)并将values 向量初始化为包含9 的单个元素
  • 我的立场是正确的。这实际上可以解决我整个代码库的实际问题。
  • 由于在 C++11 中编写 int x = { 5 }; 是完全合法的,看来 VS 编译器和我一样对 c++11 感到困惑 ;) {9} 可能是一个初始化器列表作为一个 "uniform initializer" 的 int。

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


【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-30
      • 1970-01-01
      • 2012-03-17
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      相关资源
      最近更新 更多