Поделиться через


Ошибка компилятора C2146

синтаксическая ошибка: отсутствует "token" перед идентификатором "идентификатор"

Компилятор ожидал token и нашел identifier его. Возможные причины:

  1. Ошибка орфографии или заглавной буквы.

  2. Отсутствующий описатель типа в объявлении идентификатора.

Эта ошибка может быть вызвана типографической ошибкой. Ошибка C2065 обычно предшествует этой ошибке.

Примеры

В следующем примере создается C2146.

// C2146.cpp
class CDeclaredClass {};

class CMyClass {
   CUndeclared m_myClass;   // C2146
   CDeclaredClass m_myClass2;   // OK
};

int main() {
   int x;
   int t x;   // C2146 : missing semicolon before 'x'
}

Эта ошибка также может быть создана в результате работы соответствия компилятора, которая была выполнена для Visual Studio .NET 2003: отсутствующее typename ключевое слово.

Следующий пример компилируется в Visual Studio .NET 2002, но завершится сбоем в Visual Studio .NET 2003:

// C2146b.cpp
// compile with: /c
template <typename T>
struct X {
   struct Y {
      int i;
   };
   Y memFunc();
};

template <typename T>
X<T>::Y func() { }   // C2146

// OK
template <typename T>
typename X<T>::Y func() { }

Эта ошибка также будет отображаться в результате работы соответствия компилятора, которая была выполнена для Visual Studio .NET 2003: явные специализации больше не находят параметры шаблона из первичного шаблона.

Использование T из первичного шаблона не допускается в явной специализации. Чтобы код был допустимым в Visual Studio .NET 2003 и Visual Studio .NET, замените все экземпляры параметра шаблона в специализации явным образом специализированным типом.

Следующий пример компилируется в Visual Studio .NET, но завершится сбоем в Visual Studio .NET 2003:

// C2146_c.cpp
// compile with: /c
template <class T>
struct S;

template <>
struct S<int> {
   T m_t;   // C2146
   int m_t2;   // OK
};