结构构造函数调用不明确

Vla*_*hin 3 c++ c++14

我在结构“matrix”中有 2 个构造函数。

\n\n
matrix(const unsigned int m, const unsigned int n);\nmatrix(const std::vector<std::vector<double>> &elements);\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我这样称呼它时

\n\n
matrix mat({{1},{1}});\n
Run Code Online (Sandbox Code Playgroud)\n\n

它抛出错误

\n\n
call of overloaded \xe2\x80\x98matrix(<brace-enclosed initializer list>)\xe2\x80\x99 is ambiguous\nnote: candidate: matrix::matrix(const std::vector<std::vector<double> >&)\nnote: candidate: matrix::matrix(const matrix&)\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,它认为 {{1},{1}} - 是“矩阵”对象,但是如何呢?

\n

Use*_*ess 5

因此,它认为 {{1},{1}} - 是“矩阵”对象,但是如何呢?

在您的示例代码中

matrix mat({{1},{1}});
Run Code Online (Sandbox Code Playgroud)

明确告诉编译器尝试将该表达式与matrix构造函数匹配。

它并不“认为”该表达式{{1},{1}}是一个矩阵,它试图将其变成一个矩阵,因为你要求它这样做。

至于为什么你会收到错误(这不是你问的,但似乎值得一提),这是因为

vector<double> v{1};
Run Code Online (Sandbox Code Playgroud)

是具有单个值 (1.0) 的向量的有效声明,因此

vector<vector<double>> vv{{1},{1}};
Run Code Online (Sandbox Code Playgroud)

也是包含两个元素向量的向量的有效声明,每个向量都有一个double值为 1.0 的元素,所以最后

mat{{{1},{1}}};
Run Code Online (Sandbox Code Playgroud)

将是向量构造函数的有效匹配。由于隐式允许这种转换,因此我们可以重写

mat m({{1},{1}});
Run Code Online (Sandbox Code Playgroud)

作为

mat m(mat{{{1},{1}}});
Run Code Online (Sandbox Code Playgroud)

因此存在歧义。仔细注意圆括号和大括号。

您可以使构造函数隐式,或者只是习惯统一的初始化风格并编写

mat m{{{1},{1}}};
Run Code Online (Sandbox Code Playgroud)

首先。