这是ISO C ++标准14.6 / 6的声明:
在类模板的定义内或类模板成员的定义中,当引用声明为a的类模板的先前声明的成员的非限定名称时,不需要关键字
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>
是具有参数列表{{1}的类模板中的同义词}。 ]
继承时这个陈述是真的吗?
如果是,有人可以解释一下吗?
我检查了内心阶级;它被接受了吗?但我无法检查继承?答案 0 :(得分:1)
是的,继承成员也是如此。
基本模板的成员需要关键字typename
,但通常不需要基类。基本模板需要它的原因是它们的成员不会自动进入class {}
块的范围,因此引用它们的唯一方法是使用qualified-id,这需要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;
};