Шаблоны: Разрешение имен -> Верно ли это утверждение при наследовании? - PullRequest
0 голосов
/ 17 сентября 2010

Это заявление стандарта 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 Ответ

1 голос
/ 17 сентября 2010

Да, это в равной степени относится к унаследованным элементам.

Ключевое слово 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;
};
...