2012-03-25 34 views
4

C++での多次元std :: intializer_listの使用に関する質問があります。私は、Matrixクラスを持っている、と私はこのようにそれを初期化することができるようにしたい:多次元std :: initializer_listの使用

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

私が今持っているコンストラクタは、2次元の初期化子リストの引数を取りますが、コンパイラはどのように好きではありません。私はそれを使用しています。ここでは、コードです:

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

+0

はい、私はそれが要求していたものをかなり得ていませんでした。 – Avi

答えて

7

エラーメッセージが言うようにはい、あなたはここでtypenameを記述する必要があります。

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

iteratorが依存名だからです。詳細な説明のためにこれを読む:

あなたのコンパイラがC++ 11で導入さautoをサポートしている場合、あなたはこの記述することができます。

auto i = setVec.begin(); 

を構文はるかに優れています。 std::initializer_listのようなC++ 11の機能を既に使用しているので、あなたの人生を楽にしてくれるところなら、autoを使うべきです。

+0

ありがとう、私はこれを行うでしょう、 – Avi