Megosztás a következőn keresztül:


C2143 fordítási hiba

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
}