Errore del compilatore C2059

errore di sintassi: 'token'

Il token ha causato un errore di sintassi.

Nell'esempio seguente viene generato un messaggio di errore per la riga che dichiara j.

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

Per determinare la causa dell'errore, esaminare non solo la riga elencata nel messaggio di errore, ma anche le righe sopra. Se l'analisi delle righe non restituisce alcun indizio sul problema, provare a commentare la riga elencata nel messaggio di errore e forse diverse righe sopra di essa.

Se il messaggio di errore si verifica su un simbolo che segue immediatamente una typedef variabile, assicurarsi che la variabile sia definita nel codice sorgente.

C2059 viene generato quando un nome di simbolo del preprocessore viene riutilizzato come identificatore. Nell'esempio seguente il compilatore considera DIGITS.ONE il numero 1, che non è valido come nome di elemento enumerazione:

#define ONE 1

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

È possibile ottenere C2059 se un simbolo restituisce nulla, come può verificarsi quando si usa /Dsimbolo= per la compilazione.

// 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 altro caso in cui può verificarsi C2059 è quando si compila un'applicazione che specifica una struttura negli argomenti predefiniti per una funzione. Il valore predefinito per un argomento deve essere un'espressione. Un elenco di inizializzatori, ad esempio quello usato per inizializzare una struttura, non è un'espressione. Per risolvere questo problema, definire un costruttore per eseguire l'inizializzazione richiesta.

L'esempio seguente genera l'errore 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

L'errore C2059 può verificarsi per un cast non valido.

L'esempio seguente genera l'errore 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 può verificarsi anche se si tenta di creare un nome dello spazio dei nomi contenente un punto.

L'esempio seguente genera l'errore C2059:

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

// OK
namespace A  {
   namespace B {}
}

C2059 può verificarsi quando un operatore in grado di qualificare un nome (::, ->e .) deve essere seguito dalla parola chiave template, come illustrato in questo esempio:

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
};

Per impostazione predefinita, in C++ si presuppone che AY::Rebind non è un modello; pertanto, < viene interpretato come segno minore di. È necessario indicare al compilatore in modo esplicito che Rebind è un modello in modo da poter analizzare correttamente la parentesi angolare. Per correggere questo errore, utilizzare la parola chiave template sul nome del tipo dipendente, come illustrato di seguito:

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
};