Freigeben über


Compilerfehler C2059

Syntaxfehler: 'token'

Das Token verursachte einen Syntaxfehler.

Im folgenden Beispiel wird eine Fehlermeldung für die Zeile generiert, die deklariert wird j.

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

Um die Ursache des Fehlers zu ermitteln, untersuchen Sie nicht nur die Zeile, die in der Fehlermeldung aufgeführt ist, sondern auch die Zeilen darüber. Wenn sie die Zeilen untersuchen, die kein Hinweis auf das Problem liefern, versuchen Sie, die Zeile zu kommentieren, die in der Fehlermeldung aufgeführt ist, und vielleicht mehrere Zeilen darüber.

Wenn die Fehlermeldung auf einem Symbol auftritt, das unmittelbar auf eine typedef Variable folgt, stellen Sie sicher, dass die Variable im Quellcode definiert ist.

C2059 wird ausgelöst, wenn ein Präprozessorsymbolname als Bezeichner wieder verwendet wird. Im folgenden Beispiel sieht DIGITS.ONE der Compiler die Zahl 1, die nicht als Enumerationselementname gültig ist:

#define ONE 1

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

Möglicherweise erhalten Sie C2059, wenn ein Symbol nichts auswertet, wie kann auftreten, wenn /D-Symbol= zum Kompilieren verwendet wird.

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

Ein weiterer Fall, in dem C2059 auftreten kann, ist das Kompilieren einer Anwendung, die eine Struktur in den Standardargumenten für eine Funktion angibt. Der Standardwert für ein Argument muss ein Ausdruck sein. Eine Initialisierungsliste , z. B. eine, die zum Initialisieren einer Struktur verwendet wurde, ist kein Ausdruck. Um dieses Problem zu beheben, definieren Sie einen Konstruktor, um die erforderliche Initialisierung auszuführen.

Im folgenden Beispiel wird C2059 generiert:

// 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 kann für eine ungeformte Umwandlung auftreten.

Im folgenden Beispiel wird C2059 generiert:

// 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 kann auch auftreten, wenn Sie versuchen, einen Namespacenamen zu erstellen, der einen Punkt enthält.

Im folgenden Beispiel wird C2059 generiert:

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

// OK
namespace A  {
   namespace B {}
}

C2059 kann auftreten, wenn ein Operator, der einen Namen (::, und .) qualifizieren kann, ->auf den Schlüsselwort (keyword) templatefolgt, wie in diesem Beispiel gezeigt:

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

Standardmäßig geht C++ davon aus, dass es AY::Rebind sich nicht um eine Vorlage handelt. Daher wird Folgendes < als Kleiner-als-Zeichen interpretiert. Sie müssen dem Compiler explizit mitteilen, dass Rebind es sich um eine Vorlage handelt, damit er die eckige Klammer richtig analysieren kann. Um diesen Fehler zu beheben, verwenden Sie die template Schlüsselwort (keyword) für den Namen des abhängigen Typs, wie hier gezeigt:

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