我在结构“matrix”中有 2 个构造函数。
\n\nmatrix(const unsigned int m, const unsigned int n);\nmatrix(const std::vector<std::vector<double>> &elements);\nRun Code Online (Sandbox Code Playgroud)\n\n当我这样称呼它时
\n\nmatrix mat({{1},{1}});\nRun Code Online (Sandbox Code Playgroud)\n\n它抛出错误
\n\ncall 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&)\nRun Code Online (Sandbox Code Playgroud)\n\n因此,它认为 {{1},{1}} - 是“矩阵”对象,但是如何呢?
\n因此,它认为 {{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)
首先。
| 归档时间: |
|
| 查看次数: |
1124 次 |
| 最近记录: |