Код компилируется с использованием 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
везде, где, по его мнению, это необходимо.
Полезная статья
Примечание:Не стесняйтесь редактировать ОБНОВЛЕНИЕ, если вы обнаружите что-то неправильное.