Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Chyba syntaxe: Token
Poznámky
Token způsobil chybu syntaxe.
Příklady
Následující příklad vygeneruje chybovou zprávu pro řádek, který deklaruje j.
// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
int j*; // C2059
Pokud chcete zjistit příčinu chyby, prozkoumejte nejen řádek uvedený v chybové zprávě, ale také řádky nad ní. Pokud prozkoumání řádků nezpochybní problém, zkuste okomentovat řádek uvedený v chybové zprávě a možná několik řádků nad ním.
Pokud se chybová zpráva objeví na symbolu, který bezprostředně následuje za proměnnou typedef , ujistěte se, že je proměnná definovaná ve zdrojovém kódu.
C2059 je vyvolán při opětovném použití názvu symbolu preprocesoru jako identifikátoru. V následujícím příkladu kompilátor vidí DIGITS.ONE jako číslo 1, což není platné jako název elementu výčtu:
#define ONE 1
enum class DIGITS {
ZERO,
ONE // error C2059
};
C2059 můžete získat, pokud se symbol vyhodnotí jako nic, jak může nastat, když .
// 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
}
Dalším případem, kdy může dojít K C2059 je při kompilaci aplikace, která určuje strukturu ve výchozích argumentech funkce. Výchozí hodnota argumentu musí být výraz. Seznam inicializátorů , například ten, který se používá k inicializaci struktury, není výraz. Chcete-li tento problém vyřešit, definujte konstruktor pro provedení požadované inicializace.
Následující příklad 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
C2059 může nastat pro neformulované přetypování.
Následující příklad 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
}
K C2059 může dojít také v případě, že se pokusíte vytvořit název oboru názvů, který obsahuje tečku.
Následující příklad generuje C2059:
// C2059d.cpp
// compile with: /c
namespace A.B {} // C2059
// OK
namespace A {
namespace B {}
}
C2059 může nastat, když operátor, který může kvalifikovat název (::, ->a .) musí následovat klíčové slovo template, jak je znázorněno v tomto příkladu:
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
};
Jazyk C++ ve výchozím nastavení předpokládá, že AY::Rebind není šablonou. Proto je následující < interpretováno jako méně než znaménko. Kompilátoru musíte explicitně sdělit, že Rebind jde o šablonu, aby správně parsoval úhlovou závorku. Chcete-li tuto chybu opravit, použijte template klíčové slovo pro název závislého typu, jak je znázorněno zde:
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
};