c – 结构构造函数调用不明确
发布时间:2020-12-16 10:05:34 所属栏目:百科 来源:网络整理
导读:我在struct’matrix’中有2个构造函数. matrix(const unsigned int m,const unsigned int n);matrix(const std::vectorstd::vectordouble elements); 当我这样称呼它 matrix mat({{1},{1}}); 它抛出错误 call of overloaded ‘matrix(brace-enclosed initial
我在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}} – 是’矩阵’对象,但是如何? 解决方法
在您的示例代码中 matrix mat({{1},{1}}); 你明确告诉编译器尝试将该表达式与矩阵构造函数匹配. 它并没有“认为”表达式{{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}}}; 首先. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |