Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
}