Udostępnij za pomocą


Błąd kompilatora C2143

błąd składni: brak "token1" przed "token2"

Uwagi

Kompilator oczekiwał określonego tokenu (czyli elementu języka innego niż biały znak) i zamiast tego znalazł inny token.

Sprawdź odwołanie do języka C++, aby określić, gdzie kod jest niepoprawny składniowo. Ponieważ kompilator może zgłosić ten błąd po napotkaniu wiersza, który powoduje problem, sprawdź kilka wierszy kodu poprzedzających błąd.

C2143 może wystąpić w różnych sytuacjach.

Przykłady

Może się to zdarzyć, gdy operator, który może kwalifikować nazwę (::, , i ->) musi być zgodny ze słowem kluczowym ., jak w templatetym przykładzie:

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

Domyślnie język C++ zakłada, że Ty::PutFuncType nie jest to szablon, dlatego następujący < kod jest interpretowany jako znak mniejszy niż. Należy jawnie poinformować kompilator, że PutFuncType jest to szablon, aby mógł poprawnie przeanalizować nawias kątowy. Aby naprawić ten błąd, użyj template słowa kluczowego w nazwie typu zależnego, jak pokazano poniżej:

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

C2143 może wystąpić, gdy /clr jest używany, a using dyrektywa ma błąd składni:

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

Może się to również zdarzyć, gdy próbujesz skompilować plik kodu źródłowego przy użyciu składni CLR bez użycia /clr:

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

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

Pierwszy znak inny niż biały, który jest zgodny z instrukcją if , musi być nawiasem po lewej stronie. Kompilator nie może przetłumaczyć żadnych innych elementów:

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

   // OK
   if (j < 25)
      ;

   if (j < 25)   // C2143
}

C2143 może wystąpić, gdy brakuje nawiasu klamrowego zamykającego, nawiasu lub średnika w wierszu, w którym wykryto błąd lub w jednym z wierszy tuż powyżej:

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

Lub gdy w deklaracji klasy znajduje się nieprawidłowy tag:

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

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

Lub gdy etykieta nie jest dołączona do instrukcji. Jeśli musisz umieścić etykietę samodzielnie, na przykład na końcu instrukcji złożonej, dołącz ją do instrukcji null:

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

   end2:   // C2143
}

Błąd może wystąpić, gdy do typu w standardowej bibliotece języka C++ jest wykonywane niekwalifikowane wywołanie:

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

Albo brakuje typename słowa kluczowego:

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

Możesz też spróbować zdefiniować jawne wystąpienie:

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

W programie języka C zmienne muszą być zadeklarowane na początku funkcji i nie można ich zadeklarować po wykonaniu instrukcji innych niż deklaracje.

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