使用initializer_list创建Matrix构造函数

时间:2016-09-19 05:21:55

标签: c++

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);
           ^

有没有办法将其转换为双倍?施法不起作用。

2 个答案:

答案 0 :(得分:0)

您的代码段不包含i_list的定义,但它似乎是std::initializer_list的{​​{1}}。因此,

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]); 的项目;对于每一个,它通过调用std::copy来替换内部循环。

答案 1 :(得分:0)

根据代码,我推断您的#public_send是嵌套i_list,如下所示:

initializer_list

这意味着当您拨打std::initializer_list<std::initializer_list<double>> (这是另一种撰写*(list.begin() + cnt)的方式)时,您不会获得list.begin()[cnt]元素,而是获取位置double的内部列表。

要获取元素,您必须首先获取位置cnt的内部列表,然后获取该列表的位置k的元素:

l