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<int>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 的错误的主要内容,如果未能解决你的问题,请参考以下文章