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


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

Обновлен: Ноябрь 2007

Сообщение об ошибке

ошибка синтаксиса: пропущена "лексема" перед идентификатором "идентификатор"
syntax error: missing 'token' before identifier 'identifier'.

Компилятор рассчитывал обнаружить параметр 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 C++ 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
};