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


Ошибка компилятора 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
}