Error del compilador C2059

Error de sintaxis: "token"

El token causó un error de sintaxis.

En el ejemplo siguiente se genera un mensaje de error para la línea que declara j.

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

Para determinar la causa del error, examine no solo la línea que aparece en el mensaje de error, sino también las líneas anteriores. Si al examinar las líneas no se consigue ninguna pista sobre el problema, pruebe a convertir en comentario la línea que aparece en el mensaje de error y quizás varias líneas por encima.

Si el mensaje de error se produce en un símbolo que sigue inmediatamente a una variable typedef, asegúrese de que la variable está definida en el código fuente.

C2059 se genera cuando se vuelve a usar un nombre de símbolo de preprocesador como identificador. En el ejemplo siguiente, el compilador ve DIGITS.ONE como el número 1, que no es válido como nombre de elemento de enumeración:

#define ONE 1

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

Puede obtener C2059 si un símbolo se evalúa como nada, como puede ocurrir cuando se usa el símbolo/D= para compilar.

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

Otro caso en el que se puede producir C2059 es cuando se compila una aplicación que especifica una estructura en los argumentos predeterminados de una función. El valor predeterminado de un argumento debe ser una expresión. Una lista de inicializadores (por ejemplo, una que se usa para inicializar una estructura) no es una expresión. Para resolver este problema, defina un constructor para realizar la inicialización necesaria.

El ejemplo siguiente genera el error 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 puede producirse por una conversión mal formada.

El ejemplo siguiente genera el error 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 también puede producirse si intenta crear un nombre de espacio de nombres que contenga un punto.

El ejemplo siguiente genera el error C2059:

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

// OK
namespace A  {
   namespace B {}
}

C2059 puede producirse cuando después de un operador que puede calificar un nombre (::, -> y .) debe ir la palabra clave template, como se muestra en este ejemplo:

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

De forma predeterminada, C++ supone que AY::Rebind no es una plantilla; por lo tanto, el siguiente < se interpreta como un signo menor que. Debe indicarle al compilador explícitamente que Rebind es una plantilla, para que pueda analizar correctamente el corchete angular. Para corregir este error, use la palabra clave template en el nombre del tipo dependiente, como se muestra aquí:

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