Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Chyba syntaxe: Chybí token1 před tokenem token2.
Poznámky
Kompilátor očekával konkrétní token (tj. prvek jazyka jiný než prázdné znaky) a místo toho našel jiný token.
Zkontrolujte referenční informace jazyka C++, abyste zjistili, kde je kód syntakticky nesprávný. Protože kompilátor může tuto chybu hlásit poté, co narazí na řádek, který způsobuje problém, zkontrolujte několik řádků kódu, které předchází chybě.
C2143 může nastat v různých situacích.
Příklady
Může nastat, když operátor, který může kvalifikovat název (::, ->a .) musí následovat klíčové slovo template, jako v tomto příkladu:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
{
};
};
Jazyk C++ ve výchozím nastavení předpokládá, že Ty::PutFuncType není šablonou. Proto je následující < interpretováno jako méně než znaménko. Kompilátoru musíte explicitně sdělit, že PutFuncType jde o šablonu, aby správně parsoval úhlovou závorku. Chcete-li tuto chybu opravit, použijte template klíčové slovo pro název závislého typu, jak je znázorněno zde:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
{
};
};
K C2143 může dojít při použití /clr a using direktiva má chybu syntaxe:
// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection; // C2143
using namespace System::Reflection;
Může také dojít při pokusu o kompilaci souboru zdrojového kódu pomocí syntaxe CLR bez použití / clr:
// C2143b.cpp
ref struct A { // C2143 error compile with /clr
void Test() {}
};
int main() {
A a;
a.Test();
}
První znak bez prázdných znaků, který následuje za příkazem if , musí být levá závorka. Kompilátor nemůže přeložit nic jiného:
// C2143c.cpp
int main() {
int j = 0;
// OK
if (j < 25)
;
if (j < 25) // C2143
}
C2143 může nastat v případě, že na řádku, kde je zjištěna chyba, nebo na jednom z řádků přímo nad, chybí pravá závorka, závorka nebo středník:
// C2143d.cpp
// compile with: /c
class X {
int member1;
int member2 // C2143
} x;
Nebo pokud je v deklaraci třídy neplatná značka:
// C2143e.cpp
class X {
int member;
} x;
class + {}; // C2143 + is an invalid tag name
class ValidName {}; // OK
Nebo pokud popisek není připojený k příkazu. Pokud je třeba umístit popisek sám o sobě, například na konec složeného příkazu, připojte ho k příkazu null:
// C2143f.cpp
// compile with: /c
void func1() {
// OK
end1:
;
end2: // C2143
}
K chybě může dojít v případě, že dojde k nekvalifikovanému volání typu ve standardní knihovně C++:
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
Nebo chybí typename klíčové slovo:
// 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();
}
Nebo pokud se pokusíte definovat explicitní instanci:
// 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
V programu jazyka C musí být proměnné deklarovány na začátku funkce a nelze je deklarovat poté, co funkce spustí instrukce bez deklarace.
// C2143j.c
int main()
{
int i = 0;
i++;
int j = 0; // C2143
}