Partager via


Erreur du compilateur C2143

erreur de syntaxe : 'token1' manquant avant 'token2'

Le compilateur attend un jeton spécifique (autrement dit, un élément de langage autre que l’espace blanc) et a trouvé un autre jeton à la place.

Vérifiez la référence du langage C++ pour déterminer où le code est syntactiquement incorrect. Étant donné que le compilateur peut signaler cette erreur après avoir rencontré la ligne qui provoque le problème, vérifiez plusieurs lignes de code qui précèdent l’erreur.

C2143 peut se produire dans différentes situations.

Il peut se produire lorsqu’un opérateur qui peut qualifier un nom (::, ->et .) doit être suivi du mot clé template, comme dans cet exemple :

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

Par défaut, C++ suppose qu’il Ty::PutFuncType ne s’agit pas d’un modèle ; par conséquent, les éléments suivants < sont interprétés comme un signe inférieur à celui-ci. Vous devez indiquer explicitement au compilateur qu’il PutFuncType s’agit d’un modèle afin qu’il puisse analyser correctement le crochet angle. Pour corriger cette erreur, utilisez le mot clé sur le template nom du type dépendant, comme indiqué ici :

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

C2143 peut se produire lorsque /clr est utilisé et qu’une using directive a une erreur de syntaxe :

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

Cela peut également se produire lorsque vous essayez de compiler un fichier de code source à l’aide de la syntaxe CLR sans également utiliser /clr :

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

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

Le premier caractère non blanc qui suit une if instruction doit être une parenthèse gauche. Le compilateur ne peut rien traduire d’autre :

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

   // OK
   if (j < 25)
      ;

   if (j < 25)   // C2143
}

C2143 peut se produire lorsqu’une accolade fermante, une parenthèse ou un point-virgule est manquant sur la ligne où l’erreur est détectée ou sur l’une des lignes juste au-dessus :

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

Ou lorsqu’une balise n’est pas valide dans une déclaration de classe :

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

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

Ou lorsqu’une étiquette n’est pas attachée à une instruction. Si vous devez placer une étiquette par elle-même, par exemple, à la fin d’une instruction composée, attachez-la à une instruction Null :

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

   end2:   // C2143
}

L’erreur peut se produire lorsqu’un appel non qualifié est effectué vers un type dans la bibliothèque standard C++ :

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

Ou il existe un mot clé manquant typename :

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

Ou si vous essayez de définir une instanciation explicite :

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

Dans un programme C, les variables doivent être déclarées au début de la fonction, et elles ne peuvent pas être déclarées après l’exécution des instructions de non-déclaration de la fonction.

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