Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
syntaxfel: "token1" saknas före "token2"
Anmärkningar
Kompilatorn förväntade sig en specifik token (d.v.s. ett annat språkelement än tomt utrymme) och hittade en annan token i stället.
Kontrollera språkreferensen för C++ för att avgöra var koden är syntaktiskt felaktig. Eftersom kompilatorn kan rapportera det här felet när den har stött på den rad som orsakar problemet kontrollerar du flera kodrader som föregår felet.
C2143 kan inträffa i olika situationer.
Exempel
Det kan inträffa när en operator som kan kvalificera ett namn (::, ->, och .) måste följas av nyckelordet template, som i det här exemplet:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::PutFuncType<Ty, PropTy> // error C2143
{
};
};
I standardläge förutsätter C++ att Ty::PutFuncType inte är en mall; därför tolkas följande < som ett mindre-än tecken. Du måste uttryckligen tala om för kompilatorn att det PutFuncType är en mall så att den kan parsa vinkelparentesen korrekt. Åtgärda det här felet genom att använda nyckelordet template för den beroende typens namn, som du ser här:
class MyClass
{
template<class Ty, typename PropTy>
struct PutFuncType : public Ty::template PutFuncType<Ty, PropTy> // correct
{
};
};
C2143 kan inträffa när /clr används och ett using direktiv har ett syntaxfel:
// C2143a.cpp
// compile with: /clr /c
using namespace System.Reflection; // C2143
using namespace System::Reflection;
Det kan också inträffa när du försöker kompilera en källkodsfil med hjälp av CLR-syntax utan att även använda /clr:
// C2143b.cpp
ref struct A { // C2143 error compile with /clr
void Test() {}
};
int main() {
A a;
a.Test();
}
Det första icke-blankstegstecken som följer ett if uttryck måste vara en vänsterparentes. Kompilatorn kan inte översätta något annat:
// C2143c.cpp
int main() {
int j = 0;
// OK
if (j < 25)
;
if (j < 25) // C2143
}
C2143 kan inträffa när en avslutande klammerparentes, parentes eller semikolon saknas på raden där felet identifieras eller på någon av raderna strax ovanför:
// C2143d.cpp
// compile with: /c
class X {
int member1;
int member2 // C2143
} x;
Eller när det finns en ogiltig tagg i en klassdeklaration:
// C2143e.cpp
class X {
int member;
} x;
class + {}; // C2143 + is an invalid tag name
class ValidName {}; // OK
Eller när en etikett inte är kopplad till en -instruktion. Om du måste placera en etikett på egen hand, till exempel i slutet av en sammansatt sats, bifogar du den till en nullsats.
// C2143f.cpp
// compile with: /c
void func1() {
// OK
end1:
;
end2: // C2143
}
Felet kan inträffa när ett okvalificerat anrop görs till en typ i C++-standardbiblioteket:
// C2143g.cpp
// compile with: /EHsc /c
#include <vector>
static vector<char> bad; // C2143
static std::vector<char> good; // OK
Eller så saknas typename ett nyckelord:
// 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();
}
Eller om du försöker att definiera en explicit instansiering:
// 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
I ett C-program måste variabler deklareras i början av funktionen och de kan inte deklareras efter att funktionen har kört icke-deklarationsinstruktioner.
// C2143j.c
int main()
{
int i = 0;
i++;
int j = 0; // C2143
}