Ошибка компилятора C2143
синтаксическая ошибка: отсутствует "token1" до "token2"
Компилятор ожидал конкретный маркер (то есть элемент языка, отличный от пробела) и нашел другой маркер.
Проверьте ссылку на язык C++, чтобы определить, где код является синтаксически неверным. Так как компилятор может сообщить об этой ошибке после возникновения проблемы строки, проверьте несколько строк кода, предшествующих ошибке.
C2143 может происходить в разных ситуациях.
Это может произойти, когда оператор, который может квалифицировать имя (::
, ->
и .
) должен следовать ключевому слову template
, как в следующем примере:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
{
};
};
По умолчанию C++ предполагает, что Ty::PutFuncType
не является шаблоном. Поэтому следующее <
интерпретируется как знак меньшего значения. Компилятор должен явно сообщить компилятору, что PutFuncType
является шаблоном, чтобы он смог правильно проанализировать угловую скобку. Чтобы исправить эту ошибку, используйте ключевое template
слово в имени зависимого типа, как показано ниже:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
{
};
};
C2143 может возникать при использовании /clr , а using
директива имеет синтаксическую ошибку:
// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection; // C2143
using namespace System::Reflection;
Это также может произойти при попытке компилировать файл исходного кода с помощью синтаксиса CLR без использования /clr:
// C2143b.cpp
ref struct A { // C2143 error compile with /clr
void Test() {}
};
int main() {
A a;
a.Test();
}
Первый символ, отличный от пробелов if
, следующий за оператором, должен быть левой скобкой. Компилятор не может перевести что-либо другое:
// C2143c.cpp
int main() {
int j = 0;
// OK
if (j < 25)
;
if (j < 25) // C2143
}
C2143 может возникать, если закрывающая скобка, скобка или точка с запятой отсутствуют в строке, в которой обнаружена ошибка или одна из строк выше:
// C2143d.cpp
// compile with: /c
class X {
int member1;
int member2 // C2143
} x;
Или если в объявлении класса есть недопустимый тег:
// C2143e.cpp
class X {
int member;
} x;
class + {}; // C2143 + is an invalid tag name
class ValidName {}; // OK
Или если метка не присоединена к инструкции. Если вы должны поместить метку самостоятельно, например в конце составной инструкции, прикрепите ее к инструкции NULL:
// C2143f.cpp
// compile with: /c
void func1() {
// OK
end1:
;
end2: // C2143
}
Эта ошибка может возникать, когда неквалифицированный вызов выполняется в тип в стандартной библиотеке C++:
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
Или отсутствует ключевое typename
слово:
// C2143h.cpp
template <typename T>
struct X {
struct Y {
int i;
};
Y memFunc();
};
template <typename T>
X<T>::Y X<T>::memFunc() { // C2143
// try the following line instead
// typename X<T>::Y X<T>::memFunc() {
return Y();
}
Или если вы пытаетесь определить явный экземпляр:
// C2143i.cpp
// compile with: /EHsc /c
// template definition
template <class T>
void PrintType(T i, T j) {}
template void PrintType(float i, float j){} // C2143
template void PrintType(float i, float j); // OK
В программе C переменные должны быть объявлены в начале функции, и они не могут быть объявлены после выполнения инструкций, отличных от объявления.
// C2143j.c
int main()
{
int i = 0;
i++;
int j = 0; // C2143
}