2012-03-25 60 views
4

我有一个关于在C++中使用多维std :: intializer_list的问题。我有一个Matrix类的,我希望能够将其初始化像这样:使用多维std :: initializer_list

Matrix<int, 3, 3> m({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}); 

,我现在需要的二维初始化列表的说法,但是编译器不喜欢怎么样的构造我正在使用它。下面的代码:

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]; 
     } 
    } 
} 

而这里的错误:

..\/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 

如何摆脱错误的?有没有一种方法来重构它,所以我不必做一个初始化列表的丑陋矢量或什么?

+3

您是否尝试实际阅读错误消息_? – ildjarn 2012-03-25 18:23:11

+0

是的,我没有完全得到它的要求。 – Avi 2012-03-26 01:25:29

回答

7

是,作为错误信息说,你需要在这里写typename

typename std::vector<std::initializer_list<T>>::iterator i = setVec.begin(); 

这是因为iterator是一个从属名称。阅读详细解释:

如果你的编译器支持auto由C++ 11引入,那么你可以这样写:

auto i = setVec.begin(); 

这是更好的语法。由于您已经在使用C++ 11功能,例如std::initializer_list,所以您应该开始使用auto,以便让您的生活变得轻松。

+0

谢谢,我会这样做, – Avi 2012-03-26 01:26:10

相关问题