Типовое имя C ++ и внутренние классы - PullRequest
6 голосов
/ 14 октября 2010

Я попытался найти это, но не смог найти подходящий ответ. Может ли любой гуру C ++ сказать мне, почему C ++ требует от вас объявить OuterClass <T> :: Innerclass с ключевым словом typename?

Я являюсь ТП для курса по структурам данных и постоянно вижу эту ошибку. Я знаю, чтобы сказать своим студентам, что им нужно указывать typename перед возвращаемым типом, но я не могу объяснить, почему это требуется.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 14 октября 2010

Это из-за двухфазного поиска имени в шаблонах. Когда компилятор видит Innerclass, он должен знать, является ли это имя типом или нет (это может быть, например, статический член типа int для некоторой специализации OuterClass). Таким образом, предполагается, что это НЕ имя типа, если вы не говорите так. typename должно использоваться в шаблонах и только для имен, зависящих от параметра шаблона. НТН

пример:

template <class T>
class X
{ 
   typedef T XXX;
};
template<>
class X<char>
{
   static int XXX;
};

template<class T>
class Y
{        
   // X<T>::XXX member; invalid XXX is not assumed to be a type! 
   typename X<T>::XXX member; 
   //we explicitly specify that XXX is a type; Later, upon instantiation, we will verify that
};
5 голосов
/ 14 октября 2010

OuterClass<T>::Innerclass

Это потому, что Innerclass представляет type (как я вижу из вашего вопроса), поэтому вам нужно добавить ключевое слово typename перед OuterClass<T>::Innerclass

Пример:

template <class T>
void foo() {
   T::iterator * iter;
   ...
}

Без typename T::iterator * iter; будет интерпретироваться как операция умножения между T::iterator и iter

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