Errore del compilatore C2059
errore di sintassi: 'token'
Si è verificato un errore di sintassi a causa del token.
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, non esaminare solo la riga che viene indicata nel messaggio di errore, ma anche le righe.Se l'esame delle righe non consente di individuare la causa del problema, provare a impostare come commento la riga che viene indicata nel messaggio di errore e probabilmente in più righe su.
Se il messaggio di errore si verifica su un simbolo immediatamente successivo a una variabile di typedef, assicurarsi che questa sia definita nel codice sorgente.
L'errore C2059 può venire generato se un simbolo viene valutato nothing, ad esempio quando /Dsymbol**=** viene utilizzato per compilare.
// 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 l'errore C2059 può verificarsi quando si compila un'applicazione che specifica una struttura negli argomenti predefiniti di una funzione.È necessario che il valore predefinito per un argomento sia un'espressione.Un inizializzatore elenco- ad esempio, uno che ha utilizzato per inizializzare una struttura non è un'espressione.Per risolvere questo problema, definire un costruttore per eseguire l'inizializzazione necessaria.
Nell'esempio seguente viene generato 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
È inoltre possibile che venga generato l'errore C2059 quando viene definita una classe template membro o una funzione esterna alla classe.Per informazioni, vedere Articolo della Knowledge Base 241949.
L'errore C2059 può verificarsi a causa di un cast specificato in modo non valido.
Nell'esempio seguente viene generato 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
}
L'errore C2059 può inoltre verificarsi se si tenta di creare un nome di spazio dei nomi contenente un punto.
Nell'esempio seguente viene generato l'errore C2059:
// C2059d.cpp
// compile with: /c
namespace A.B {} // C2059
// OK
namespace A {
namespace B {}
}
L'errore C2059 può verificarsi quando un operatore che può specificare un nome (::, ->e .) deve essere seguito dalla parola chiave template, come illustrato nel seguente 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, C++ si presuppone che AY::Rebind non è un modello; pertanto,< viene interpretato come segno di minore di.È necessario indicare al compilatore in modo esplicito che Rebind è un modello in modo da poter analizzare correttamente la parentesi angolare.Per correggere l'errore, utilizzare la parola chiave di template il 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
};