Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
syntaxisfout: 'token'
Opmerkingen
Het token heeft een syntaxisfout veroorzaakt.
Voorbeelden
In het volgende voorbeeld wordt een foutbericht gegenereerd voor de regel die declareert j.
// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
int j*; // C2059
Als u de oorzaak van de fout wilt bepalen, bekijkt u niet alleen de regel die wordt vermeld in het foutbericht, maar ook de regels erboven. Als het onderzoeken van de regels geen idee heeft van het probleem, kunt u de regel die wordt vermeld in het foutbericht en misschien meerdere regels erboven uitcommentariëren.
Als het foutbericht optreedt op een symbool dat direct na een typedef variabele volgt, moet u ervoor zorgen dat de variabele is gedefinieerd in de broncode.
C2059 wordt gegenereerd wanneer de naam van een preprocessorsymbool opnieuw wordt gebruikt als id. In het volgende voorbeeld ziet DIGITS.ONE de compiler het getal 1, dat niet geldig is als de naam van een enum-element:
#define ONE 1
enum class DIGITS {
ZERO,
ONE // error C2059
};
Mogelijk krijgt u C2059 als een symbool niets evalueert, zoals kan gebeuren wanneer /D-symbool= wordt gebruikt om te compileren.
// 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
}
Een ander geval waarin C2059 kan optreden, is wanneer u een toepassing compileert die een structuur opgeeft in de standaardargumenten voor een functie. De standaardwaarde voor een argument moet een expressie zijn. Een initialisatielijst, bijvoorbeeld een lijst die wordt gebruikt om een structuur te initialiseren, is geen expressie. U kunt dit probleem oplossen door een constructor te definiëren om de vereiste initialisatie uit te voeren.
In het volgende voorbeeld wordt C2059 gegenereerd:
// 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 optreden voor een ziek gevormde cast.
In het volgende voorbeeld wordt C2059 gegenereerd:
// 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 ook optreden als u probeert een naamruimtenaam te maken die een punt bevat.
In het volgende voorbeeld wordt C2059 gegenereerd:
// C2059d.cpp
// compile with: /c
namespace A.B {} // C2059
// OK
namespace A {
namespace B {}
}
C2059 kan optreden wanneer een operator die een naam kan kwalificeren (::, ->en .) moet worden gevolgd door het trefwoord template, zoals wordt weergegeven in dit voorbeeld:
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
};
Standaard wordt in C++ ervan uitgegaan dat dit AY::Rebind geen sjabloon is. Daarom wordt het volgende < geïnterpreteerd als een kleiner teken. U moet de compiler expliciet vertellen dat Rebind dit een sjabloon is, zodat deze de hoekhaak correct kan parseren. Als u deze fout wilt corrigeren, gebruikt u het template trefwoord op de naam van het afhankelijke type, zoals hier wordt weergegeven:
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
};