Ошибка компилятора C2146
Обновлен: Ноябрь 2007
Сообщение об ошибке
ошибка синтаксиса: пропущена "лексема" перед идентификатором "идентификатор"
syntax error: missing 'token' before identifier 'identifier'.
Компилятор рассчитывал обнаружить параметр token, но вместо него обнаружил параметр identifier. Возможные причины:
Ошибка правописания или неверно выбран регистр.
Пропущен спецификатор типа в объявлении идентификатора.
Причиной этой ошибки может быть типографская опечатка. Как правило, этой ошибке предшествует ошибка 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
};