Kompilatorfel C2059

syntaxfel: "token"

Anmärkningar

Token orsakade ett syntaxfel.

Exempel

I följande exempel genereras ett felmeddelande för raden som deklarerar j.

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

För att fastställa orsaken till felet undersöker du inte bara den rad som visas i felmeddelandet, utan även raderna ovanför det. Om du undersöker raderna ger ingen aning om problemet kan du prova att kommentera ut raden som visas i felmeddelandet och kanske flera rader ovanför det.

Om felmeddelandet visas på en symbol som omedelbart följer en typedef variabel kontrollerar du att variabeln har definierats i källkoden.

C2059 utlöses när ett symbolnamn för förprocessorn återanvänds som identifierare. I följande exempel ser DIGITS.ONE kompilatorn som nummer 1, vilket inte är giltigt som ett uppräkningselementnamn:

#define ONE 1

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

Du kan få C2059 om en symbol utvärderas till ingenting, vilket kan inträffa när /D-symbolen= används för kompilering.

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

Ett annat fall där C2059 kan inträffa är när du kompilerar ett program som anger en struktur i standardargumenten för en funktion. Standardvärdet för ett argument måste vara ett uttryck. En initialiserarlista– till exempel en som används för att initiera en struktur – är inte ett uttryck. Lös problemet genom att definiera en konstruktor för att utföra den nödvändiga initieringen.

I följande exempel genereras 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 kan uppstå för en dåligt formad gjutning.

I följande exempel genereras 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 kan också inträffa om du försöker skapa ett namnområdesnamn som innehåller en punkt.

I följande exempel genereras C2059:

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

// OK
namespace A  {
   namespace B {}
}

C2059 kan inträffa när en operator som kan kvalificera ett namn (::, ->, och .) måste följas av nyckelordet template, som visas i det här exemplet:

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

I standardläge förutsätter C++ att AY::Rebind inte är en mall; därför tolkas följande < som ett mindre-än tecken. Du måste uttryckligen tala om för kompilatorn att det Rebind är en mall så att den kan parsa vinkelparentesen korrekt. Åtgärda det här felet genom att använda nyckelordet template för den beroende typens namn, som du ser här:

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