结构构造函数调用不明确

Struct constructor call is ambiguous

本文关键字:不明确 函数调用 结构      更新时间:2023-10-16

我在结构体'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

    1. matrix(const unsigned int m, const unsigned int n)创建临时矩阵。(第一个{1}匹配m,第二个{1}匹配n

    2. 尝试使用matrix(const matrix&)从临时构造mat

将第一个(或两个)构造函数标记为explicit将明确地使matrix mat({{1},{1}})调用...

matrix(const std::vector<std::vector<double>> &elements);

。一。

魔杖盒示例