Błąd kompilatora C2059

błąd składni: "token"

Token spowodował błąd składniowy.

Poniższy przykład generuje komunikat o błędzie dla wiersza, który deklaruje jwartość .

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

Aby określić przyczynę błędu, sprawdź nie tylko wiersz wymieniony w komunikacie o błędzie, ale także wiersze powyżej niego. Jeśli badanie wierszy nie daje żadnych wskazówek dotyczących problemu, spróbuj dodać komentarz do wiersza wymienionego w komunikacie o błędzie i być może kilka wierszy powyżej niego.

Jeśli komunikat o błędzie występuje w symbolu, który natychmiast następuje po typedef zmiennej, upewnij się, że zmienna jest zdefiniowana w kodzie źródłowym.

C2059 jest wywoływany, gdy nazwa symbolu preprocesora jest ponownie używana jako identyfikator. W poniższym przykładzie kompilator widzi DIGITS.ONE jako liczbę 1, która jest nieprawidłowa jako nazwa elementu wyliczenia:

#define ONE 1

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

Jeśli symbol zwróci wartość niczego, możesz uzyskać wartość C2059, co może wystąpić, gdy symbol= /Djest używany do kompilowania.

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

Innym przypadkiem, w którym może wystąpić C2059, jest skompilowanie aplikacji, która określa strukturę w domyślnych argumentach funkcji. Wartość domyślna argumentu musi być wyrażeniem. Lista inicjatora — na przykład taka, która została użyta do zainicjowania struktury — nie jest wyrażeniem. Aby rozwiązać ten problem, zdefiniuj konstruktor do wykonania wymaganej inicjalizacji.

Poniższy przykład generuje kod 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 może wystąpić dla nieumyślnej obsady.

Poniższy przykład generuje kod 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 może również wystąpić, jeśli próbujesz utworzyć nazwę przestrzeni nazw, która zawiera kropkę.

Poniższy przykład generuje kod C2059:

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

// OK
namespace A  {
   namespace B {}
}

C2059 może wystąpić, gdy operator, który może kwalifikować nazwę (::, , i .) musi być zgodny ze słowem kluczowym template, jak pokazano w ->tym przykładzie:

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

Domyślnie język C++ zakłada, że AY::Rebind nie jest to szablon, dlatego następujący < kod jest interpretowany jako znak mniejszy niż. Należy jawnie poinformować kompilator, że Rebind jest to szablon, aby mógł poprawnie przeanalizować nawias kątowy. Aby naprawić ten błąd, użyj template słowa kluczowego w nazwie typu zależnego, jak pokazano poniżej:

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