Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
szintaxishiba: a token1 hiányzik a token2 előtt
Megjegyzések
A fordító egy adott tokent várt (azaz egy üres helytől eltérő nyelvi elemet), és helyette egy másik tokent talált.
Ellenőrizze a C++ nyelvi referenciát annak megállapításához, hogy a kód szintaktikailag helytelen-e. Mivel a fordító jelentheti ezt a hibát, miután a hibát okozó sorba ütközik, ellenőrizze a hibát megelőző kódsorokat.
A C2143 különböző helyzetekben fordulhat elő.
Példák
Ez akkor fordulhat elő, ha egy nevet (::és ->.) minősítő operátort a kulcsszónak templatekell követnie, ahogyan ebben a példában is látható:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
{
};
};
Alapértelmezés szerint a C++ azt feltételezi, hogy Ty::PutFuncType ez nem sablon, ezért az alábbiakat < a rendszer kevesebb előjelként értelmezi. Ahhoz, hogy a fordítóprogram megfelelően tudja elemezni a szögletes zárójelet, kifejezetten meg kell adnia, hogy a PutFuncType egy sablon. A hiba kijavításához használja a template függő típus nevét tartalmazó kulcsszót az itt látható módon:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
{
};
};
C2143 akkor fordulhat elő, ha /clr van használatban, és egy using irányelv szintaxishibát jelez:
// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection; // C2143
using namespace System::Reflection;
Akkor is előfordulhat, ha a forráskódfájlt CLR-szintaxissal próbálja lefordítani a /clr használata nélkül:
// C2143b.cpp
ref struct A { // C2143 error compile with /clr
void Test() {}
};
int main() {
A a;
a.Test();
}
Az utasítást if követő első nem szóköz karakternek bal zárójelnek kell lennie. A fordító nem tud mást lefordítani:
// C2143c.cpp
int main() {
int j = 0;
// OK
if (j < 25)
;
if (j < 25) // C2143
}
C2143 akkor fordulhat elő, ha hiányzik egy záró zárójel, zárójel vagy pontosvessző azon a vonalon, ahol a hiba észlelhető, vagy a fenti sorok egyikén:
// C2143d.cpp
// compile with: /c
class X {
int member1;
int member2 // C2143
} x;
Vagy ha egy osztálydeklarációban érvénytelen címke található:
// C2143e.cpp
class X {
int member;
} x;
class + {}; // C2143 + is an invalid tag name
class ValidName {}; // OK
Vagy ha egy címke nincs egy utasításhoz hozzáerősítve. Ha önmagában kell elhelyeznie egy címkét, például egy összetett utasítás végén, csatolja egy üres utasításhoz:
// C2143f.cpp
// compile with: /c
void func1() {
// OK
end1:
;
end2: // C2143
}
A hiba akkor fordulhat elő, ha a C++ standard kódtár egyik típusára nem minősített hívás történik:
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
Vagy hiányzik egy typename kulcsszó:
// 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();
}
Vagy ha explicit példányosítást próbál definiálni:
// 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
A C programban a változókat a függvény elején kell deklarálni, és nem deklarálhatók, miután a függvény végrehajtja a deklarálási utasításokat.
// C2143j.c
int main()
{
int i = 0;
i++;
int j = 0; // C2143
}