C2143 с вложенными шаблонами классов - PullRequest
0 голосов
/ 26 мая 2011

Привет У меня есть некоторые сомнения по поводу пересмотра шаблонов.Пожалуйста, посмотрите следующий фрагмент.

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. Почему объявление 'obj3' внутри main () работает без typename.

Примечание: фрагмент кода выполняется на VC ++ 8.0

Спасибозаранее

Ответы [ 2 ]

3 голосов
/ 26 мая 2011
1 голос
/ 26 мая 2011
Компилятор

не имеет понятия, если CSmall<T_Type>::Const_Itr является типом или переменной. Так что вы должны оказать некоторую помощь. В то время как CSmall<int>::Const_Itr, очевидно, является типом.

...