Error del compilador C2059Compiler Error C2059

error de sintaxis: ' token 'syntax error : 'token'

El token provocó un error de sintaxis.The token caused a syntax error.

En el ejemplo siguiente se genera un mensaje de error para la línea que declara j .The following example generates an error message for the line that declares 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.To determine the cause of the error, examine not only the line that's listed in the error message, but also the lines above it. Si el examen de las líneas no da ninguna pista sobre el problema, intente comentar la línea que aparece en el mensaje de error y quizás varias líneas por encima.If examining the lines yields no clue about the problem, try commenting out the line that's listed in the error message and perhaps several lines above it.

Si el mensaje de error se produce en un símbolo que sigue inmediatamente a una typedef variable, asegúrese de que la variable se define en el código fuente.If the error message occurs on a symbol that immediately follows a typedef variable, make sure that the variable is defined in the source code.

El error C2059 se genera cuando se vuelve a usar un nombre de símbolo de preprocesador como identificador.C2059 is raised when a preprocessor symbol name is re-used as an identifier. 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:In the following example, the compiler sees DIGITS.ONE as the number 1, which is not valid as an enum element name:

#define ONE 1

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

Puede obtener C2059 si un símbolo se evalúa como Nothing, como puede ocurrir cuando se usa /dSymbol = para compilar.You may get C2059 if a symbol evaluates to nothing, as can occur when /Dsymbol= is used to compile.

// 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 el error C2059 es cuando se compila una aplicación que especifica una estructura en los argumentos predeterminados de una función.Another case in which C2059 can occur is when you compile an application that specifies a structure in the default arguments for a function. El valor predeterminado de un argumento debe ser una expresión.The default value for an argument must be an expression. Una lista de inicializadores, por ejemplo, una que se usa para inicializar una estructura, no es una expresión.An initializer list—for example, one that used to initialize a structure—is not an expression. Para resolver este problema, defina un constructor para realizar la inicialización necesaria.To resolve this problem, define a constructor to perform the required initialization.

En el ejemplo siguiente se genera C2059:The following example generates 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

El error C2059 puede producirse en una conversión con formato incorrecto.C2059 can occur for an ill-formed cast.

El ejemplo siguiente genera C2059:The following sample generates 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
}

El error C2059 también puede producirse si se intenta crear un nombre de espacio de nombres que contenga un punto.C2059 can also occur if you attempt to create a namespace name that contains a period.

El ejemplo siguiente genera C2059:The following sample generates C2059:

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

// OK
namespace A  {
   namespace B {}
}

El error C2059 puede producirse cuando un operador que puede calificar un nombre ( :: , -> y . ) debe ir seguido de la palabra clave template , tal y como se muestra en este ejemplo:C2059 can occur when an operator that can qualify a name (::, ->, and .) must be followed by the keyword template, as shown in this example:

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, lo siguiente < se interpreta como un signo de menor que.By default, C++ assumes that AY::Rebind isn't a template; therefore, the following < is interpreted as a less-than sign. Debe indicar explícitamente al compilador que Rebind es una plantilla para que pueda analizar correctamente el corchete angular.You must tell the compiler explicitly that Rebind is a template so that it can correctly parse the angle bracket. Para corregir este error, use la template palabra clave en el nombre del tipo dependiente, como se muestra aquí:To correct this error, use the template keyword on the dependent type's name, as shown here:

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