Freigeben über


Compilerfehler C2143

Syntaxfehler: Fehlendes 'token1' vor 'token2'

Der Compiler hat ein bestimmtes Token (d. h. ein anderes Sprachelement als Leerzeichen) erwartet und stattdessen ein anderes Token gefunden.

Überprüfen Sie den C++-Sprachverweis , um festzustellen, wo Code syntaktisch falsch ist. Da der Compiler diesen Fehler nach dem Auftreten der Zeile melden kann, die das Problem verursacht, überprüfen Sie mehrere Codezeilen, die dem Fehler vorausgehen.

C2143 kann in verschiedenen Situationen auftreten.

Er kann auftreten, wenn ein Operator, der einen Namen (::, und .) qualifizieren kann, ->mit dem Schlüsselwort templategefolgt werden muss, wie in diesem Beispiel:

class MyClass
{
    template<class Ty, typename PropTy>
    struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
    {
    };
};

Standardmäßig geht C++ davon aus, dass es Ty::PutFuncType sich nicht um eine Vorlage handelt. Daher wird Folgendes < als Kleiner-als-Zeichen interpretiert. Sie müssen dem Compiler explizit mitteilen, dass PutFuncType es sich um eine Vorlage handelt, damit er die eckige Klammer richtig analysieren kann. Um diesen Fehler zu beheben, verwenden Sie das template Schlüsselwort für den Namen des abhängigen Typs, wie hier gezeigt:

class MyClass
{
    template<class Ty, typename PropTy>
    struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
    {
    };
};

C2143 kann auftreten, wenn /clr verwendet wird und eine using Direktive einen Syntaxfehler aufweist:

// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection;   // C2143
using namespace System::Reflection;

Sie können auch auftreten, wenn Sie versuchen, eine Quellcodedatei mithilfe der CLR-Syntax zu kompilieren, ohne auch "/clr" zu verwenden:

// C2143b.cpp
ref struct A {   // C2143 error compile with /clr
   void Test() {}
};

int main() {
   A a;
   a.Test();
}

Das erste Nicht-Leerzeichen, das einer if Anweisung folgt, muss eine linke Klammer sein. Der Compiler kann nichts anderes übersetzen:

// C2143c.cpp
int main() {
   int j = 0;

   // OK
   if (j < 25)
      ;

   if (j < 25)   // C2143
}

C2143 kann auftreten, wenn eine schließende Klammer, Klammer oder Semikolon in der Zeile fehlt, in der der Fehler erkannt wird oder in einer der Zeilen direkt oben:

// C2143d.cpp
// compile with: /c
class X {
   int member1;
   int member2   // C2143
} x;

Oder wenn in einer Klassendeklaration ein ungültiges Tag vorhanden ist:

// C2143e.cpp
class X {
   int member;
} x;

class + {};   // C2143 + is an invalid tag name
class ValidName {};   // OK

Oder wenn eine Bezeichnung nicht an eine Anweisung angefügt ist. Wenn Sie eine Beschriftung selbst platzieren müssen, z. B. am Ende einer zusammengesetzten Anweisung, fügen Sie sie an eine NULL-Anweisung an:

// C2143f.cpp
// compile with: /c
void func1() {
   // OK
   end1:
      ;

   end2:   // C2143
}

Der Fehler kann auftreten, wenn ein nicht qualifizierter Aufruf an einen Typ in der C++-Standardbibliothek erfolgt:

// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad;   // C2143
static std::vector<char> good;   // OK

Oder es fehlt ein typename Schlüsselwort:

// 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();
}

Oder wenn Sie versuchen, eine explizite Instanziierung zu definieren:

// 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

In einem C-Programm müssen Variablen am Anfang der Funktion deklariert werden, und sie können nicht deklariert werden, nachdem die Funktion Anweisungen zur Nichtdeklaration ausführt.

// C2143j.c
int main()
{
    int i = 0;
    i++;
    int j = 0; // C2143
}