Udostępnij za pośrednictwem


Błąd kompilatora C2059

Błąd składni: "tokenu"

Token spowodował błąd składni.

W poniższym przykładzie generuje komunikat o błędzie dla wiersza, który deklaruje j.

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

Aby ustalić przyczynę błędu, sprawdź nie tylko wiersz, który jest wymieniony w komunikacie o błędzie, ale także wiersze powyżej niej.Jeśli badanie wiersze daje pojęcia dotyczące problemu, spróbuj komentowanie poza wiersz, który jest wymieniony w komunikacie o błędzie i może być kilka wierszy powyżej niej.

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

Możesz się C2059 Jeśli symbol zwraca nic, jak to ma miejsce gdy /Dsymbol**=** jest używana 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 przypadku, w którym może wystąpić C2059 jest podczas kompilowania aplikacji, która określa strukturę do domyślnego argumentów dla funkcji.Domyślna wartość argumentu musi być wyrażeniem.Lista inicjująca — na przykład taką, która użyta do zainicjować struktury — nie jest wyrażeniem. Aby rozwiązać ten problem, należy zdefiniować Konstruktor do wykonywania wymaganych inicjowania.

W poniższym przykładzie generuje 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

Można również uzyskać C2059 po zdefiniowaniu Członkowskie szablonu klasy lub funkcji poza klasą.Aby uzyskać informacje, zobacz artykuł bazy wiedzy Knowledge Base 241949.

C2059 może wystąpić w cast źle sformułowane.

Poniższy przykład spowoduje wygenerowanie błędu 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 użytkownik próbuje utworzyć nazwę obszaru nazw, która zawiera znak kropki.

Poniższy przykład spowoduje wygenerowanie błędu C2059:

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

// OK
namespace A  {
   namespace B {}
}

C2059 może wystąpić, gdy operator, która może kwalifikować się nazwę (::, ->, i .) musi być następuje słowo kluczowe template, jak pokazano w poniższym 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, C++ zakłada się, że AY::Rebind nie jest szablonem; w związku z tym, następujące < jest interpretowana jako mniej-niż znak. Musisz nakazuje kompilatorowi jawnie który Rebind jest szablonem, tak aby go poprawnie analizować nawias kątowy.Aby poprawić ten błąd, należy użyć template słowa kluczowego w utrzymaniu wpisz nazwę, 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
};