Bagikan melalui


Compiler Error C2059

kesalahan sintaks : 'token'

Komentar

Token menyebabkan kesalahan sintaks.

Contoh

Contoh berikut menghasilkan pesan kesalahan untuk baris yang menyatakan j.

// C2059e.cpp
// compile with: /c
// C2143 expected
// Error caused by the incorrect use of '*'.
   int j*; // C2059

Untuk menentukan penyebab kesalahan, periksa tidak hanya baris yang tercantum dalam pesan kesalahan, tetapi juga baris di atasnya. Jika memeriksa baris tidak menghasilkan petunjuk tentang masalah, coba komentari baris yang tercantum dalam pesan kesalahan dan mungkin beberapa baris di atasnya.

Jika pesan kesalahan terjadi pada simbol yang segera mengikuti typedef variabel, pastikan variabel ditentukan dalam kode sumber.

C2059 dinaikkan ketika nama simbol praproscessor digunakan kembali sebagai pengidentifikasi. Dalam contoh berikut, pengkompilasi melihat DIGITS.ONE sebagai angka 1, yang tidak valid sebagai nama elemen enum:

#define ONE 1

enum class DIGITS {
    ZERO,
    ONE // error C2059
};

Anda mungkin mendapatkan C2059 jika simbol mengevaluasi ke apa-apa, seperti yang dapat terjadi ketika =digunakan untuk mengkompilasi.

// 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
}

Kasus lain di mana C2059 dapat terjadi adalah ketika Anda mengkompilasi aplikasi yang menentukan struktur dalam argumen default untuk fungsi. Nilai default untuk argumen harus berupa ekspresi. Daftar penginisialisasi—misalnya, daftar yang digunakan untuk menginisialisasi struktur—bukan ekspresi. Untuk mengatasi masalah ini, tentukan konstruktor untuk melakukan inisialisasi yang diperlukan.

Contoh berikut menghasilkan 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 dapat terjadi untuk pemeran yang tidak terbentuk.

Contoh berikut menghasilkan 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 juga dapat terjadi jika Anda mencoba membuat nama namespace yang berisi titik.

Contoh berikut menghasilkan C2059:

// C2059d.cpp
// compile with: /c
namespace A.B {}   // C2059

// OK
namespace A  {
   namespace B {}
}

C2059 dapat terjadi ketika operator yang dapat memenuhi syarat nama (::, , dan ->) harus diikuti dengan kata kunci ., seperti yang ditunjukkan templatedalam contoh ini:

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
};

Secara default, C++ mengasumsikan bahwa AY::Rebind itu bukan templat; oleh karena itu, berikut ini < ditafsirkan sebagai tanda kurang dari. Anda harus memberi tahu pengompilasi secara eksplisit bahwa Rebind itu adalah templat sehingga dapat mengurai kurung sudut dengan benar. Untuk memperbaiki kesalahan ini, gunakan template kata kunci pada nama jenis dependen, seperti yang ditunjukkan di sini:

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
};