Partilhar via


Erro do Compilador C2059

erro de sintaxe: “token”

O token gerou um erro de sintaxe.

O exemplo a seguir gerenciar 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 delas. Se examinar as linhas não gerencie nenhum indício sobre o problema, tente comentar a linha que está listada na mensagem de erro e talvez em várias linhas acima deles.

Se a mensagem de erro ocorrer em um símbolo que segue imediatamente uma variável de typedef , certifique-se de que a variável é definido no código-fonte.

Você pode obter C2059 se um símbolo avalia a nada, como pode ocorrer quando /Dsymbol**=** é usado para criar.

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

Outros casos 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 usada para inicializar a vezes não é uma expressão. Para resolver esse problema, defina um construtor para executar a inicialização necessário.

O exemplo a seguir gerenciar 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 do membro fora da classe. Para obter mais informações, consulte Artigo da Base de Dados de Conhecimento 241949.

C2059 pode ocorrer para uma conversão doente- bem formada.

O seguinte exemplo gera 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 poderá ocorrer se você tentar criar um nome do namespace que contém um ponto.

O seguinte exemplo gera 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++ supõe que AY::Rebind não é um modelo; consequentemente, seguinte < é interpretado como menor que o sinal. Você deve informar ao compilador explicitamente que Rebind é um modelo de forma que possa corretamente analisar o colchetes angulares. Para corrigir esse erro, use a palavra-chave no nome de template dependente 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
};