typedef with templates

时间:2011-05-20 18:41:02

标签: c++ templates typedef

template<class T> struct A {
    typedef int Int;
    A::Int b; // Line 1 (fails)
    Int c; // Line 2 (compiles)
};

int main(){    
   A<int> x;
   x.c = 13;
}

错误

error: ISO C++ forbids declaration of ‘Int’ with no type
error: extra qualification ‘A<T>::’ on member ‘Int’
error: expected ‘;’ before ‘b’

第1行失败但第2行编译。为什么呢?

1 个答案:

答案 0 :(得分:11)

您需要typename

typename A::Int b;

typename关键字是必需的,因为使用限定名称A::Int引用该成员。

Int c没问题,因为在这种情况下没有使用限定名称。

14.6 / 6

  

在类模板的定义内或类模板成员的定义中,当引用先前声明的成员的非限定名称时,不需要关键字 typename     声明类型的类模板关键字 typename 应始终指定     使用限定名称引用成员,即使限定符只是类模板名称。