Lihat juga daftar standar C ++ dan tipe yang dapat dibangun secara default
Bukan masalah besar, hanya menjengkelkan karena saya tidak ingin kelas saya dibuat tanpa argumen tertentu.
#include <map>
struct MyClass
{
MyClass(int t);
};
int main() {
std::map<int, MyClass> myMap;
myMap[14] = MyClass(42);
}
Ini memberi saya kesalahan g ++ berikut:
/usr/include/c++/4.3/bits/stl_map.h:419: error: tidak ada fungsi yang cocok untuk panggilan ke 'MyClass ()'
Ini mengkompilasi dengan baik jika saya menambahkan konstruktor default; Saya yakin itu tidak disebabkan oleh sintaks yang salah.
c++
dictionary
Nick Bolton
sumber
sumber
Jawaban:
Masalah ini datang dengan operator []. Kutipan dari dokumentasi SGI:
Jika Anda tidak memiliki konstruktor default, Anda dapat menggunakan fungsi sisipkan / temukan. Contoh berikut berfungsi dengan baik:
sumber
emplace
dalam C ++ 11 sebagai alternatif singkat untukinsert
.std::<map>::value_type
ada diinsert
telepon?= default
seharusnya bekerja dengan baik.Iya. Nilai dalam penampung STL perlu mempertahankan semantik salinan. IOW, mereka perlu berperilaku seperti tipe primitif (misalnya int) yang berarti, antara lain, mereka harus dapat dibangun secara default.Tanpa ini (dan persyaratan lainnya), akan sulit untuk mengimplementasikan berbagai operasi salin / pindahkan / tukar / bandingkan internal pada struktur data yang digunakan container STL.Setelah mengacu pada Standar C ++, saya melihat jawaban saya tidak akurat. Konstruksi default, pada kenyataannya, bukanlah suatu persyaratan :
Dari 20.1.4.1:
Jadi, tegasnya, jenis nilai Anda hanya perlu dapat dibangun secara default jika Anda kebetulan menggunakan fungsi penampung yang menggunakan konstruktor default dalam tanda tangannya.
Persyaratan sebenarnya (23.1.3) dari semua nilai yang disimpan dalam wadah STL adalah
CopyConstructible
danAssignable
.Ada juga persyaratan khusus lainnya untuk wadah tertentu, seperti keberadaan
Comparable
(misalnya untuk kunci di peta).Kebetulan, berikut ini mengkompilasi tanpa kesalahan pada hasil :
Jadi ini mungkin masalah g ++.
sumber
Periksa persyaratan tipe yang disimpan dari stl :: map. Banyak koleksi stl mengharuskan tipe yang disimpan berisi beberapa properti tertentu (konstruktor default, konstruktor salinan, dll.).
Konstruktor tanpa argumen dibutuhkan oleh stl :: map, karena ini digunakan, saat operator [] dipanggil dengan kunci, yang belum disimpan oleh peta. Dalam hal ini operator [] menyisipkan entri baru yang terdiri dari kunci baru dan nilai yang dibuat menggunakan konstruktor tanpa parameter. Dan nilai baru ini kemudian dikembalikan.
sumber
Periksa apakah:
Deklarasi std :: map tampaknya benar, saya kira.
sumber
Kemungkinan besar karena std :: pair membutuhkannya. std :: pair menyimpan dua nilai menggunakan semantik nilai sehingga Anda harus dapat membuatnya tanpa parameter. Jadi kode ini menggunakan std :: pair di berbagai tempat untuk mengembalikan nilai peta ke pemanggil dan ini biasanya dilakukan dengan membuat instance pasangan kosong dan menetapkan nilai ke dalamnya sebelum mengembalikan pasangan lokal.
Anda bisa menyiasati ini dengan penunjuk cerdas menggunakan peta <int, smartptr <MyClass>> tetapi itu menambahkan overhead pemeriksaan penunjuk nol.
sumber