Share via


Derleyici Hatası C2059

söz dizimi hatası: 'belirteç'

Belirteç bir söz dizimi hatasına neden oldu.

Aşağıdaki örnek, öğesini bildiren jsatı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ü templatetakip 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
};