Шаблоны: Разрешение имен -> Верно ли это утверждение при наследовании?

Это утверждение из стандарта 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;
};
Другие вопросы по тегам