gpt4 book ai didi

c++ - 结构构造函数调用不明确

转载 作者:太空狗 更新时间:2023-10-29 20:10:05 24 4
gpt4 key购买 nike

我在 struct '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}} - 是“矩阵”对象,但如何呢?

最佳答案

So, it thinks, that {{1},{1}} - is 'matrix' object, but how?

在您的示例代码中

matrix mat({{1},{1}});

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

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

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

vector<double> v{1};

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

vector<vector<double>> vv{{1},{1}};

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

mat{{{1},{1}}};

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

mat m({{1},{1}});

作为

mat m(mat{{{1},{1}}});

因此产生了歧义。仔细注意圆括号和大括号。

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

mat m{{{1},{1}}};

首先。

关于c++ - 结构构造函数调用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42278875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com