Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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 template
gefolgt 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
}