Ошибка компилятора C2146
синтаксическая ошибка: отсутствует "token" перед идентификатором "идентификатор"
Компилятор ожидал 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 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
};