结构构造函数调用不明确
Struct constructor call is ambiguous
我在结构体'matrix'中有2个构造函数。
matrix(const unsigned int m, const unsigned int n);
matrix(const std::vector<std::vector<double>> &elements);
当我这样称呼它时
matrix mat({{1},{1}});
它抛出错误
call of overloaded ‘matrix(<brace-enclosed initializer list>)’ is ambiguous
note: candidate: matrix::matrix(const std::vector<std::vector<double> >&)
note: candidate: matrix::matrix(const matrix&)
所以,它认为,{{1},{1}} - 是"矩阵"对象,但如何?
所以,它认为 {{1},{1}} - 是"矩阵"对象,但如何?
在示例代码中
matrix mat({{1},{1}});
您显式告诉编译器尝试将该表达式与matrix
构造函数匹配。
它不会"认为"表达式{{1},{1}}
是一个矩阵,而是试图把它变成一个矩阵,因为你要求它这样做。
至于为什么你得到错误(这不是你问的,但似乎值得一提),这是因为
vector<double> v{1};
是具有单个值 (1.0) 的向量的有效声明,因此
vector<vector<double>> vv{{1},{1}};
也是包含两个元素向量的有效声明,每个向量都有一个值为 1.0 的double
元素,因此最后
mat{{{1},{1}}};
将是矢量构造函数的有效匹配项。由于这种转换是隐式允许的,因此我们可以重写
mat m({{1},{1}});
如
mat m(mat{{{1},{1}}});
因此模棱两可。仔细注意圆形和大括号。
你可以使构造函数隐式,或者只是习惯于统一的初始化风格和编写
mat m{{{1},{1}}};
首先。
调用matrix mat({{1},{1}})
时,编译器会发现以下两个不明确的构造路径:
-
通过构造两个向量(一个向量内有一个元素)来调用
vector<vector>>
构造函数。 -
使用第一个构造函数隐式创建一个临时矩阵,然后使用该临时构造函数构造
mat
。-
从
matrix(const unsigned int m, const unsigned int n)
创建临时矩阵。(第一个{1}
匹配m
,第二个{1}
匹配n
。 -
尝试使用
matrix(const matrix&)
从临时构造mat
。
-
将第一个(或两个)构造函数标记为explicit
将明确地使matrix mat({{1},{1}})
调用...
matrix(const std::vector<std::vector<double>> &elements);
。一。
魔杖盒示例
相关文章:
- 父类的私有函数会导致对具有相同名称和相似参数的子类中的公共函数的不明确调用
- 对重载函数find_first_not_of的不明确调用
- 调用'Node'构造函数是不明确的
- "fpclassify":对重载函数的不明确调用
- 为什么调用具有通用或 r 值引用的重载覆盖函数是不明确的?
- 重载调用是不明确的:一对内联映射作为构造函数参数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C++具有可变参数包的函数的部分模板参数推导会在 Clang 和 MSVC 中产生不明确的调用
- 对静态重载(类)函数/方法的调用是不明确的
- 这个函数调用应该不明确吗?
- 使用列表初始化的不明确构造函数调用
- 循环依赖(类对类型定义,类型定义对类),前向声明给出不明确的调用
- 为什么初始值设定项列表中的元素数会导致不明确的调用错误
- C++中来自不同基类的不明确函数
- 对自身的不明确函数调用
- C++ 中的不明确函数
- 在c++中使用[]而不是函数调用
- 显然,不明确的调用不会在GCC上导致编译错误
- 可转换的类型和不明确的调用
- 为什么使用bind而不是函数调用?