我做了一个 Matrix
具有此类构造函数的类:
Matrix<T>(const vector<vector<T>> &m)
如果我这样做,我可以实例化一个 Matrix
对象:
vector<vector<double>> a_v {
{ 17, 24, 1},
{ 23, 5, 7 },
{ 4, 6, 13 }
};
Matrix<double> a=a_v;
它工作正常,但我认为 che 构造函数应该充当类型转换器,我认为这段代码也应该工作:
Matrix<double> a= {
{ 17, 24, 1},
{ 23, 5, 7 },
{ 4, 6, 13 }
};
然而,对于第二个代码,我得到了这个错误:
could not convert ‘{{17, 24, 1}, {23, 5, 7}, {4, 6, 13}}’ from 'brace-enclosed initializer list' to ‘Matrix’
为什么 C++11
不转换 brace-enclosed initializer
至 vector<vector<double>>
自动?
这样初始化矩阵应该怎么办?
最佳答案
你有两个选择:
- 添加一个采用
std::initializer_list<std::initializer_list<T>>
的构造函数 用另一组
{}
封闭 init 表达式即Matrix<double> a{{ { 17, 24, 1}, { 23, 5, 7 }, { 4, 6, 13 } }};
好的,我会试着解释一下这里发生的事情:
如果没有构造函数采用 std::initializer_list
然后是最外面的{}
如果你愿意,总是打开和关闭构造函数调用,而不是你实际传递给构造函数的部分。
Matrix<double> a{ {1, 2}, {3, 4} };
^ ^~~~~~~~~~~~~~ ^
| 2 parameters |
| |
| |
opening closing
如您所见,这被视为具有 2 个参数的构造函数,在本例中为 2 个 initializer_lists。
这就是为什么您需要另一组 {}
的原因:
Matrix<double> a{ {{1, 2}, {3, 4}} };
^ ^~~~~~~~~~~~~~~~ ^
| 1 parameter |
| |
| |
opening closing
为了最外层{}
被认为是一个 initializer_list 那么构造函数需要有一个重载 initializer_list
.这就是 std::vector
中发生的事情。案例。
关于c++11 - vector 不转换大括号括起来的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45939190/