![](/img/trans.png)
[英]Using std::initializer_list constructor without creating ambiguities?
[英]Creating a Matrix constructor using initializer_list
Matrix::Matrix(const i_list & list){
uint rows = list.size();
uint cols = list.begin()->size();
int cnt = 0;
mtrx = new double*[rows];
for(int j = 0; j < cols; j++){
mtrx[j] = new double[cols];
}
for(int k = 0; k < rows; k++){
for(int l = 0; l < cols; l++){
mtrx[k][l] = *(list.begin() + cnt);
cnt++;
}
}
}
它不断给我错误:
Matrix.cpp:30:15: error: cannot convert ‘const
std::initializer_list<double>’ to ‘double’ in assignment
mtrx[k][l] = *(list.begin() + cnt);
^
有没有办法将其转换为double? 铸造不起作用。
您的段不包含的定义i_list
,但它似乎是一个std::initializer_list
的initializer_list
秒。 最后,
*(list.begin() + cnt);
是一个initializer_list
对象本身(一个内部对象),而不是一个double
。 这就是您收到的错误消息。
您可能希望将双循环转换为如下所示:
#include <algorithm>
auto inner = std::begin(list);
for(int k = 0; k < rows; ++k, ++inner)
std::copy(std::begin(*inner), std::end(*inner), &mtrx[k][0]);
这将遍历list
的项目; 对于每一个,它通过调用std::copy
替换内部循环。
根据代码,我推断您的i_list
是一个嵌套的initializer_list
如下所示:
std::initializer_list<std::initializer_list<double>>
这意味着当您调用*(list.begin() + cnt)
(这是编写list.begin()[cnt]
另一种方式)时,您不会得到double
元素,而是在位置cnt
处得到一个内部列表。
要获取元素,您必须首先获取位置k
处的内部列表,然后获取该列表位置l
处的元素:
mtrx[k][l] = list.begin()[k].begin()[l];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.