具有嵌套模板类的C2143

C2143 with nested template classes

本文关键字:C2143 嵌套      更新时间:2023-10-16

嗨,我对重新分级模板有一些疑问。请看下面的片段。

template<class T_Type1>
class CSmall
{
public:  
  class Const_Itr
  {
    T_Type1  Outer_A;
  };
private:
  T_Type1  Inner_A;
};
template<class T_Type>
class CBig
{
public:
  CSmall<T_Type>::Const_Itr*            obj1;//ERROR C2143: syntax error : missing ';' before '*'
  typename CSmall<T_Type>::Const_Itr*   obj2;// NO error after using 'typename' keyword
}; // CIPPortExpectationHandler
void main()
{
  CSmall<int>::Const_Itr*   obj3;// NO error even if 'typename' keyword in NOT used.
}

有人能给我解释一下吗

  1. 为什么"obj1"的声明出现错误
  2. typename如何在声明"obj2"时解决此问题。编译器获得了什么信息
  3. 为什么main()内部的"obj3"声明在没有typename的情况下有效

注意:代码段是在VC++8.0 上编译的

提前感谢

请参阅以下常见问题解答:模板typename关键字用于什么?

编译器不知道CSmall<T_Type>::Const_Itr是类型还是变量。所以你应该提供一些帮助。而CCD_ 3显然是一种类型。