![](/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.