0

这是来自 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>。]

这句话在继承时是真的吗?

如果是,任何人都可以解释一下吗?

我检查了内部类;它被接受了吗?但我无法检查继承?

4

1 回答 1

1

是的,继承的成员也是如此。

基模板typename的成员需要关键字,但一般基类不需要。基本模板需要它的原因是它们的成员不会自动进入块的范围,因此引用它们的唯一方法是使用限定 ID,这需要.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;
};
于 2010-09-17T06:06:51.677 回答