Udostępnij za pośrednictwem


C2059 błąd kompilatora

Błąd składniowy: "token"

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, należy przeanalizować nie tylko wiersz, który jest wymieniony w komunikacie o błędzie, ale również wiersze powyżej niej.Jeśli badanie linii daje pojęcia o problemie, spróbuj komentowanie poza wiersz, który jest wymieniony w komunikacie o błędzie i być może na kilka wierszy powyżej niej.

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

Możesz się C2059 Jeśli symbol zwraca się do niczego, jak to ma miejsce podczas /Dsymbol**=** służy 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 C2059 może wystąpić jest podczas kompilowania aplikacji, która określa strukturę w argumentach domyślne dla funkcji.Wartość domyślna dla 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 inicjalizacji.

Poniższy przykład 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, w przypadku zdefiniowania Członkowskie szablonu klasy lub funkcja spoza klasy.Aby uzyskać informacje, zobacz artykułu bazy wiedzy Knowledge Base 241949.

C2059 może tak się stać się obsadą źle sformułowane.

Poniższy przykład generuje 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 podczas próby utworzenia nazwy obszaru nazw, która zawiera znak kropki.

Poniższy przykład generuje 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ć się nazwę (::, ->, i .) musi następować 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-znak większości.Trzeba poinformować kompilator jawnie że Rebind jest szablonem, tak, aby ją 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
};