Błąd kompilatora C2059
błąd składni: "token"
Token spowodował błąd składniowy.
Poniższy przykład generuje komunikat o błędzie dla wiersza, który deklaruje j
wartość .
// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
int j*; // C2059
Aby określić przyczynę błędu, sprawdź nie tylko wiersz wymieniony w komunikacie o błędzie, ale także wiersze powyżej niego. Jeśli badanie wierszy nie daje żadnych wskazówek dotyczących problemu, spróbuj dodać komentarz do wiersza wymienionego w komunikacie o błędzie i być może kilka wierszy powyżej niego.
Jeśli komunikat o błędzie występuje w symbolu, który natychmiast następuje po typedef
zmiennej, upewnij się, że zmienna jest zdefiniowana w kodzie źródłowym.
C2059 jest wywoływany, gdy nazwa symbolu preprocesora jest ponownie używana jako identyfikator. W poniższym przykładzie kompilator widzi DIGITS.ONE
jako liczbę 1, która jest nieprawidłowa jako nazwa elementu wyliczenia:
#define ONE 1
enum class DIGITS {
ZERO,
ONE // error C2059
};
Jeśli symbol zwróci wartość niczego, możesz uzyskać wartość C2059, co może wystąpić, gdy symbol= /Djest używany 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 przypadkiem, w którym może wystąpić C2059, jest skompilowanie aplikacji, która określa strukturę w domyślnych argumentach funkcji. Wartość domyślna argumentu musi być wyrażeniem. Lista inicjatora — na przykład taka, która została użyta do zainicjowania struktury — nie jest wyrażeniem. Aby rozwiązać ten problem, zdefiniuj konstruktor do wykonania wymaganej inicjalizacji.
Poniższy przykład generuje kod 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 może wystąpić dla nieumyślnej obsady.
Poniższy przykład generuje kod 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 próbujesz utworzyć nazwę przestrzeni nazw, która zawiera kropkę.
Poniższy przykład generuje kod 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ć nazwę (::
, , i .
) musi być zgodny ze słowem kluczowym template
, jak pokazano w ->
tym 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 język C++ zakłada, że AY::Rebind
nie jest to szablon, dlatego następujący <
kod jest interpretowany jako znak mniejszy niż. Należy jawnie poinformować kompilator, że Rebind
jest to szablon, aby mógł poprawnie przeanalizować nawias kątowy. Aby naprawić ten błąd, użyj template
słowa kluczowego w nazwie typu zależnego, 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
};
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla