Вложенная структура в шаблонном классе с помощью std :: map :: const_iterator? - PullRequest
3 голосов
/ 19 марта 2009

Следующий код генерирует синтаксическую ошибку в строке, где объявлен итератор:

template <typename T>
class A
{
  public:

    struct B
    {
       int x, y, z;
    };

    void a()
    {
        std::map<int, B>::const_iterator itr; // error: ; expected before itr
    }

    std::vector<T> v;
    std::map<int, B> m;
};

Это происходит только тогда, когда A является шаблонным классом. Что не так с этим кодом? Если я переместу B из A, код скомпилируется нормально.

1 Ответ

8 голосов
/ 19 марта 2009

Вам нужно имя:

 typename std::map<int, B>::const_iterator itr;

Итератор является зависимым типом (зависит от B), и когда у вас есть такая ситуация, компилятор требует, чтобы вы разъяснили его с помощью имени типа.

Существует разумное обсуждение вопроса здесь .

...