Да, это в равной степени относится к унаследованным элементам.
Ключевое слово 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;
};