使用 initializer_list 创建矩阵构造函数
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);
^
有没有办法将其转换为双精度?铸造不起作用。
您的代码段不包含i_list
的定义,但似乎它是 initializer_list
s 的std::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];
相关文章:
- 通过构造函数创建的所有对象都具有相同的向量
- 通过构造函数创建一些值并尝试添加到文档中使用 rapidjson 不起作用
- 通过零参数构造函数创建的 glm::mat4 应该包含哪些值?
- std::map<int, A> 运算符 [] 需要使用空构造函数创建 A
- 稍后使用<Class>调用类构造函数创建 std::vector
- 通过类构造函数创建线程
- 尝试使用构造函数创建对象时出错
- 运算符 = 不匹配,构造函数创建一个指针
- C++ - 类构造函数创建对象,但构造的结果不同
- 我可以为带有参数的构造函数创建类工厂
- 我们可以说构造函数创建对象
- 如何使用在另一个类的构造函数中的堆栈上接受参数的构造函数创建对象
- 构造函数创建const对象
- 使用基构造函数创建派生对象
- 使用函数中的复制构造函数创建实例的副本,该函数获取作为基对象传递的实例
- 在从基类构造函数创建的单独线程中调用纯虚函数
- 递增由向 boost::p ython 公开的构造函数创建的对象的引用计数
- 通过使用不同的构造函数创建类的实例
- 通过使用不同的构造函数创建对象,并最终释放对象的内存
- 如何使用重载构造函数创建两个动态对象