Использование многомерного std :: initializer_list - PullRequest
5 голосов
/ 25 марта 2012

У меня есть вопрос об использовании многомерного std :: intializer_list в C ++. У меня есть класс Matrix, и я хочу иметь возможность инициализировать его следующим образом:

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

Как мне избавиться от этой ошибки? Есть ли способ реструктурировать его, чтобы мне не пришлось создавать этот уродливый вектор из списка инициализаторов или что-то в этом роде?

1 Ответ

8 голосов
/ 25 марта 2012

Да, как говорится в сообщении об ошибке, вам нужно написать 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 везде, где это облегчает вашу жизнь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...