создание итератора контейнера внутри шаблона функции

Код компилируется с использованием GCC. Это работает без ошибок в VC++

template 
void Function(T& A){

  T::iterator it; //Error : dependent-name 'T::iterator' is parsed as a non-type,
                  //but instatiation yields a type.
}

В этой статье говорится, что компилятор не может определить, является ли итератор в Tтипе классом или просто статическим членом. Поэтому мы должны использовать ключевое слово typenameдля классификации символа как типа.

Мой вопрос заключается в том, что, поскольку Tизвестно во время компиляции -, компилятор уже знает, что iteratorвнутри T является классом (, в моем случае T равенvector). Так почему возникает ошибка?

Кроме того, это еще одно использование ключевого слова typenameпомимо его использования в качестве определения параметра шаблона T.

ОБНОВЛЕНИЕ:

Я прочитал все ответы и другие ответы от здесь , которые действительно ответили на все мои мысли. Я могу подвести итог этому:

Правильным компилятором, который обрабатывает это право, является Gcc. VC++ позволит вам скомпилировать деформированный код. Ошибка, возникающая при компиляции с помощью Gcc, связана с анализом синтаксиса, поскольку Gcc попытается проанализировать код шаблона функции, но обнаружит синтаксическую ошибку T::iterator it;, поскольку Gcc по умолчанию рассматривает T::iteratorкак переменную.(T::iteratorанализируется как не -тип ), а не как тип, чтобы решить эту проблему, вы должны явно указать Gcc рассматривать T::iteratorкак тип, это делается путем добавления ключевого слова typename.
Теперь вернемся к VС++. ответ на вопрос, почему это сработало, заключается в существующей ошибке в VC++, а именно в том, задерживает ли VC++ решение о том, является ли T::iteratorпеременной или типом. или VC++ предоставляет ключевое слово typenameвезде, где, по его мнению, это необходимо.


Полезная статья
Примечание:Не стесняйтесь редактировать ОБНОВЛЕНИЕ, если вы обнаружите что-то неправильное.

5
задан Community 23 May 2017 в 11:55
поделиться