Derleyici Hatası C2059
söz dizimi hatası: 'belirteç'
Belirteç bir söz dizimi hatasına neden oldu.
Aşağıdaki örnek, öğesini bildiren j
satır için bir hata iletisi oluşturur.
// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
int j*; // C2059
Hatanın nedenini belirlemek için yalnızca hata iletisinde listelenen satırı değil, üzerindeki satırları da inceleyin. Satırların incelenmesi sorun hakkında hiçbir ipucu vermezse, hata iletisinde listelenen satırı ve belki de üzerinde birkaç satırı açıklama eklemeyi deneyin.
Hata iletisi bir değişkenin hemen ardından gelen bir typedef
simgede oluşuyorsa, değişkenin kaynak kodda tanımlandığından emin olun.
C2059, bir ön işlemci sembol adı tanımlayıcı olarak yeniden kullanıldığında oluşturulur. Aşağıdaki örnekte, derleyici bir numaralandırma öğesi adı olarak geçerli olmayan 1 sayısı olarak görür DIGITS.ONE
:
#define ONE 1
enum class DIGITS {
ZERO,
ONE // error C2059
};
Derlemek için /D= simgesi kullanıldığında olabileceği gibi, bir simge hiçbir şey değerlendirmezse C2059 alabilirsiniz.
// 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
}
C2059'un oluşabileceği bir diğer durum da, bir işlevin varsayılan bağımsız değişkenlerinde bir yapı belirten bir uygulama derlediğiniz durumlardır. Bağımsız değişkenin varsayılan değeri bir ifade olmalıdır. Başlatıcı listesi (örneğin, bir yapıyı başlatmak için kullanılan liste) bir ifade değildir. Bu sorunu çözmek için gerekli başlatmayı gerçekleştirmek için bir oluşturucu tanımlayın.
Aşağıdaki örnek C2059 oluşturur:
// 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, kötü biçimlendirilmiş bir döküm için oluşabilir.
Aşağıdaki örnek C2059 oluşturur:
// 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, nokta içeren bir ad alanı adı oluşturmaya çalıştığınızda da oluşabilir.
Aşağıdaki örnek C2059 oluşturur:
// C2059d.cpp
// compile with: /c
namespace A.B {} // C2059
// OK
namespace A {
namespace B {}
}
C2059, bir adı (::
, ->
ve .
) niteleyebilecek bir işlecin, bu örnekte gösterildiği gibi anahtar sözcüğünü template
takip etmesi gerektiğinde oluşabilir:
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
};
Varsayılan olarak, C++ bunun AY::Rebind
bir şablon olmadığını varsayar; bu nedenle, aşağıdakiler <
küçüktür işareti olarak yorumlanır. Açılı ayraç doğru ayrıştırabilmesi için derleyiciye bunun bir şablon olduğunu açıkça Rebind
belirtmeniz gerekir. Bu hatayı düzeltmek için, burada gösterildiği gibi bağımlı türün adında anahtar sözcüğünü kullanın template
:
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
};
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin