Erreur du compilateur C2059

erreur de syntaxe : 'token'

Le jeton a provoqué une erreur de syntaxe.

L’exemple suivant génère un message d’erreur pour la ligne qui déclare j.

// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
   int j*; // C2059

Pour déterminer la cause de l’erreur, examinez non seulement la ligne répertoriée dans le message d’erreur, mais également les lignes ci-dessus. Si l’examen des lignes ne donne aucun indice sur le problème, essayez de commenter la ligne répertoriée dans le message d’erreur et peut-être plusieurs lignes au-dessus.

Si le message d’erreur se produit sur un symbole qui suit immédiatement une typedef variable, assurez-vous que la variable est définie dans le code source.

C2059 est déclenché lorsqu’un nom de symbole de préprocesseur est réutilisé en tant qu’identificateur. Dans l’exemple suivant, le compilateur voit DIGITS.ONE le nombre 1, qui n’est pas valide en tant que nom d’élément d’énumération :

#define ONE 1

enum class DIGITS {
    ZERO,
    ONE // error C2059
};

Vous pouvez obtenir C2059 si un symbole n’est évalué à rien, comme cela peut se produire lorsque le symbole= /Dest utilisé pour compiler.

// C2059a.cpp
// compile with: /DTEST=
#include <stdio.h>

int main() {
   #ifdef TEST
      printf_s("\nTEST defined %d", TEST);   // C2059
   #else
      printf_s("\nTEST not defined");
   #endif
}

Un autre cas dans lequel C2059 peut se produire est lorsque vous compilez une application qui spécifie une structure dans les arguments par défaut d’une fonction. La valeur par défaut d’un argument doit être une expression. Une liste d’initialiseurs( par exemple, celle utilisée pour initialiser une structure) n’est pas une expression. Pour résoudre ce problème, définissez un constructeur pour effectuer l’initialisation requise.

L’exemple suivant génère l’erreur C2059 :

// C2059b.cpp
// compile with: /c
struct ag_type {
   int a;
   float b;
   // Uncomment the following line to resolve.
   // ag_type(int aa, float bb) : a(aa), b(bb) {}
};

void func(ag_type arg = {5, 7.0});   // C2059
void func(ag_type arg = ag_type(5, 7.0));   // OK

C2059 peut se produire pour un cast mal formé.

L’exemple suivant génère l’erreur C2059 :

// C2059c.cpp
// compile with: /clr
using namespace System;
ref class From {};
ref class To : public From {};

int main() {
   From^ refbase = gcnew To();
   To^ refTo = safe_cast<To^>(From^);   // C2059
   To^ refTo2 = safe_cast<To^>(refbase);   // OK
}

C2059 peut également se produire si vous tentez de créer un nom d’espace de noms qui contient un point.

L’exemple suivant génère l’erreur C2059 :

// C2059d.cpp
// compile with: /c
namespace A.B {}   // C2059

// OK
namespace A  {
   namespace B {}
}

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

template <typename T> struct Allocator {
    template <typename U> struct Rebind {
        typedef Allocator<U> Other;
    };
};

template <typename X, typename AY> struct Container {
    typedef typename AY::Rebind<X>::Other AX; // error C2059
};

Par défaut, C++ suppose qu’il AY::Rebind 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 Rebind s’agit d’un modèle afin qu’il puisse analyser correctement le crochet angle. Pour corriger cette erreur, utilisez le template mot clé sur le nom du type dépendant, comme indiqué ici :

template <typename T> struct Allocator {
    template <typename U> struct Rebind {
        typedef Allocator<U> Other;
    };
};

template <typename X, typename AY> struct Container {
    typedef typename AY::template Rebind<X>::Other AX; // correct
};