Avi*_*Avi 5 c++ matrix multidimensional-array initializer-list c++11
我有一个关于在C++中使用多维std :: intializer_list的问题.我有一个Matrix类,我希望能够像这样初始化它:
Matrix<int, 3, 3> m({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}});
Run Code Online (Sandbox Code Playgroud)
我现在的构造函数接受一个二维初始化列表的参数,但编译器不喜欢我如何使用它.这是代码:
template<typename T, unsigned int rows, unsigned int cols>
Matrix<T, rows, cols>::Matrix(std::initializer_list<std::initializer_list<T> > set)
{
std::vector<std::initializer_list<T> > setVec = set;
std::vector<std::vector<T> > v;
for (std::vector<std::initializer_list<T> >::iterator i = setVec.begin(); i != setVec.end(); i++)
{
v.push_back(std::vector<T>(*i));
}
this->matrixData = new T*[rows];
for (unsigned int i = 0; i < rows; i++)
{
this->matrixData[i] = new T[cols];
for (unsigned int j = 0; j < cols; j++)
{
this->matrixData[i][j] = v[i][j];
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
..\/utils/Matrix.h:138:7: error: need 'typename' before 'std::vector<std::initializer_list<_CharT> >::iterator' because 'std::vector<std::initializer_list<_CharT> >' is a dependent scope
Run Code Online (Sandbox Code Playgroud)
我该如何摆脱这个错误?有没有办法重组它所以我不必制作初始化列表或其他东西的丑陋的向量?
是的,正如错误消息所示,您需要在typename此处写道:
typename std::vector<std::initializer_list<T>>::iterator i = setVec.begin();
Run Code Online (Sandbox Code Playgroud)
这是因为iterator是一个从属名称.阅读本文了解详细说明:
如果您的编译器支持autoC++ 11引入,那么您可以这样写:
auto i = setVec.begin();
Run Code Online (Sandbox Code Playgroud)
这是更好的语法.由于您已经在使用C++ 11等功能std::initializer_list,因此您应该开始使用auto它让您的生活更轻松的地方.