5

C++での多次元std::intializer_listの使用について質問があります。Matrixクラスがあり、次のように初期化できるようにしたいと思います。

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

そのエラーを取り除くにはどうすればよいですか?初期化リストなどの醜いベクトルを作成する必要がないように再構築する方法はありますか?

4

1 に答える 1

8

はい、エラーメッセージにあるように、typenameここに書き込む必要があります。

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

iterator従属名だからです。詳細な説明については、これをお読みください。

コンパイラがC++11によって導入されたものをサポートしている場合は、次のautoように記述できます。

auto i = setVec.begin();

これははるかに優れた構文です。のようなC++11機能をすでに使用しているので、それがあなたの生活を楽にするところならどこでもstd::initializer_list使い始めるべきです。auto

于 2012-03-25T09:04:22.790 に答える