Шаблоны: Разрешение имен -> Верно ли это утверждение при наследовании?
Это утверждение из стандарта ISO C++ 14.6/6:
В определении шаблона класса или в определении члена шаблона класса ключевое слово
typename
не требуется при обращении к неквалифицированному имени ранее объявленного члена шаблона класса, который объявляет тип. Ключевое словоtypename
всегда указывается, когда к члену обращаются с использованием квалифицированного имени, даже если квалификатор является просто именем шаблона класса. [Пример:template<class T> struct A { typedef int B; A::B b; // ill-formed: typename required before A::B void f(A<T>::B); // ill-formed: typename required before A<T>::B typename A::B g(); // OK };
Ключевое слово typename необходимо указывать, является ли полное имя
A
или жеA<T>
так какA
или жеA<T>
синонимы в шаблоне класса со списком параметров<T>
, ]
Верно ли это утверждение при наследовании?
Если да, может кто-нибудь объяснить это?
Я проверил с внутренним классом; это принято? Но я не могу проверить по наследству?
1 ответ
Да, это в равной степени относится и к унаследованным членам.
Ключевое слово typename
требуется для членов базовых шаблонов, но не для базовых классов в целом. Причина, по которой это требуется для базовых шаблонов, заключается в том, что их члены не попадают автоматически в область действия class {}
блок, поэтому единственный способ обратиться к ним с помощью квалифицированного идентификатора, который требует typename
,
template< typename >
class base1
{ typedef int type1; };
class base2
{ typedef int type2; };
template< typename A >
class derived
: base1< A >, base2 {
typename base1< A >::type1 x;
type2 y;
};