模板:名称解析 - >在继承时,此语句是真的吗?

时间:2010-09-17 05:57:29

标签: c++ templates name-resolution

这是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>,因为AA<T>是具有参数列表{{1}的类模板中的同义词}。 ]

继承时这个陈述是真的吗?

如果是,有人可以解释一下吗?

我检查了内心阶级;它被接受了吗?但我无法检查继承?

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;
};