C2059 de erro do compilador
erro de sintaxe: “token”
O token causou um erro de sintaxe.
O exemplo a seguir gera uma mensagem de erro para a linha que declara j.
// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
int j*; // C2059
Para determinar a causa do erro, examine não apenas a linha que está listada na mensagem de erro, mas também as linhas acima.Se examinar as linhas não produz nenhum dica sobre o problema, tente comentário para fora a linha que está listada na mensagem de erro e talvez em várias linhas acima dele.
Se a mensagem de erro ocorre em um símbolo que seguem imediatamente uma variável de typedef , certifique-se de que a variável está definido no código-fonte.
Você pode obter C2059 se um símbolo avalia a nada, como pode ocorrer quando /Dsymbol**=** é usado 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
}
Outro caso em que são C2059 pode ocorrer quando você cria um aplicativo que especifica uma estrutura nos argumentos padrão para uma função.O valor padrão para um argumento deve ser uma expressão.Um inicializador lista- por exemplo, um que usou para inicializar ao não é uma expressão.Para resolver esse problema, defina um construtor para executar a inicialização necessária.
O exemplo a seguir produz 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
Você também pode obter C2059 se você definir uma classe ou uma função do modelo de membro fora da classe.Para mais informações, consulte Artigo de Base de Dados de Conhecimento 241949.
C2059 pode ocorrer por uma conversão doente- formada.
O exemplo a seguir produz 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 também pode ocorrer se você tentar criar um nome de namespace que contém um ponto.
O exemplo a seguir produz C2059:
// C2059d.cpp
// compile with: /c
namespace A.B {} // C2059
// OK
namespace A {
namespace B {}
}
C2059 pode ocorrer quando um operador que pode qualificar um nome (::, ->, e .) deve ser seguido pela palavra-chave template, conforme mostrado neste exemplo:
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
};
Por padrão, C++ pressupõe que AY::Rebind não é um modelo; como consequência, seguir < é interpretado como o símbolo de menor que o sinal.Você deve explicitamente instruir o compilador que Rebind é um modelo para que possa corretamente analisar o colchete angular.Para corrigir este erro, use a palavra-chave de template dependente no nome do tipo, conforme mostrado aqui:
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
};