Saya telah mengerjakan beberapa kode C ++ yang telah ditulis seorang teman dan saya mendapatkan kesalahan berikut yang belum pernah saya lihat sebelumnya ketika mengkompilasi dengan gcc4.6:
error: use of deleted function
‘GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member ‘const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h’
Edit: Ini berasal dari bagian kode yang menggunakan boost MSM: Boost Webpage
Sunting2: Tidak ada yang = delete()
digunakan di mana pun di kode sumber.
Secara umum, apa arti kesalahan ini? Apa yang harus saya cari ketika jenis kesalahan ini terjadi?
Jawaban:
Pesan kesalahan dengan jelas mengatakan bahwa konstruktor default telah dihapus secara implisit . Ia bahkan mengatakan mengapa: kelas berisi variabel const non-statis, yang tidak akan diinisialisasi oleh ctor default.
Karena
X::x
ituconst
, itu harus diinisialisasi - tetapi ctor default biasanya tidak menginisialisasi (karena ini adalah tipe POD). Oleh karena itu, untuk mendapatkan ctor default, Anda perlu mendefinisikannya sendiri (dan harus menginisialisasix
). Anda bisa mendapatkan situasi yang sama dengan anggota yang menjadi referensi:Mungkin perlu dicatat bahwa keduanya juga akan menonaktifkan pembuatan implisit dari operator penugasan, karena alasan yang pada dasarnya sama. Operator penugasan implisit biasanya melakukan penugasan berdasarkan anggota, tetapi dengan anggota const atau anggota referensi, tidak dapat melakukannya karena anggota tersebut tidak dapat ditetapkan. Untuk membuat tugas berfungsi, Anda perlu menulis operator tugas Anda sendiri.
Inilah sebabnya mengapa seorang
const
anggota biasanya harus statis - ketika Anda melakukan tugas, Anda tetap tidak dapat menetapkan anggota const. Dalam kasus umum, semua instance Anda akan memiliki nilai yang sama sehingga mungkin juga berbagi akses ke satu variabel daripada memiliki banyak salinan variabel yang semuanya akan memiliki nilai yang sama.Tentu saja dimungkinkan untuk membuat instance dengan nilai yang berbeda - Anda (misalnya) memberikan nilai saat Anda membuat objek, sehingga dua objek yang berbeda dapat memiliki dua nilai yang berbeda. Namun, jika Anda mencoba melakukan sesuatu seperti menukar mereka, anggota const akan mempertahankan nilai aslinya alih-alih ditukar.
sumber
C++ error: use of deleted function
Anda menggunakan fungsi yang ditandai sebagai
deleted
.Misalnya:
= Delete adalah fitur baru dari C ++ 0x. Ini berarti kompilator harus segera berhenti mengkompilasi dan mengeluh "fungsi ini dihapus" setelah pengguna menggunakan fungsi tersebut.
Jika Anda melihat kesalahan ini, Anda harus memeriksa deklarasi fungsi untuk
=delete
.Untuk mengetahui lebih lanjut tentang fitur baru yang diperkenalkan di C ++ 0x, lihat ini .
sumber
C++ error: use of deleted function
gcc 4.6 mendukung fitur baru dari fungsi yang dihapus, di mana Anda dapat menulis
untuk menonaktifkan konstruktor default.
Di sini kompilator jelas melihat bahwa konstruktor default tidak dapat dibuat, dan
=delete
itu untuk Anda.sumber
Saya mengalami kesalahan ini saat mewarisi dari kelas abstrak dan tidak menerapkan semua metode virtual murni di subkelas saya.
sumber
public virtual
dari kelas dasar tingkat 2 di mana kelas dasar tingkat 1 memiliki konstruktor default yang dihapus secara eksplisit. Menghapusvirtual
memperbaiki masalah tanpa harus menerapkan semua metode.Dalam standar C ++ 0x saat ini, Anda dapat secara eksplisit menonaktifkan konstruktor default dengan sintaks hapus, misalnya
Gcc 4.6 adalah versi pertama yang mendukung sintaks ini, jadi mungkin itulah masalahnya ...
sumber
Gcc 4.6 is the first version to support this syntax
Saya rasa itu akan menjelaskan mengapa saya belum pernah melihatnya sebelumnya karena saya baru saja mulai menggunakan gcc4.6 baru-baru ini.Beralih dari gcc 4.6 ke gcc 4.8 menyelesaikan masalah ini untuk saya.
sumber