vector 不转换大括号括起来的列表
vector does not convert brace encloser list
我用这种类型的构造函数制作了一个 Matrix
class:
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
案例中发生的情况。
我用这种类型的构造函数制作了一个 Matrix
class:
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
案例中发生的情况。