Вложенная структура в шаблонном классе с std::map::const_iterator?

StackOverflow https://stackoverflow.com/questions/661481

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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, код компилируется нормально.

Это было полезно?

Решение

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top