Sejauh yang saya tahu, sejak C++17 beberapa struktur data STL mungkin "ada" dengan tipe yang tidak lengkap sebagai parameter templat yang menggambarkan tipe yang disimpan. Misalnya, saya dapat menggunakan std::unique_ptr<Incomplete>
(saya tidak yakin apakah itu struktur data) atau std::vector<Incomplete>
sebagai anggota kelas jika semua properti kelas (yang memerlukan definisi Incomplete
) diimplementasikan dalam file .cpp terpisah:
class Incomplete;
using Complete = int;
class Foo {
private:
std::unique_ptr<Incomplete> u_p;
std::vector<Incomplete> v;
std::deque<Incomplete> d;
std::list<Incomplete> l;
std::set<Incomplete> s;
std::unordered_map<Complete, Complete> u_m_cc;
std::unordered_map<Complete, Incomplete> u_m_ci;
std::unordered_map<Incomplete, Complete> u_m_ic;
std::unordered_map<Incomplete, Incomplete> u_m_ii;
public:
// implemented in a separate .cpp which has Incomplete defined:
Foo();
Foo(Foo&&);
Foo& operator=(Foo&&);
Foo(Foo const&);
Foo& operator=(Foo const&);
~Foo();
};
Jadi, manakah dari anggota data yang tercantum di atas yang valid untuk penggunaan tersebut? Bagaimana dengan struktur data lainnya, smart pointer, dll.?
std::vector
danstd::unique_ptr
baik-baik saja,std::unordered_map
menolak bekerja di MSVC saya: std::pair menggunakan struct yang tidak lengkap. Bahkan jika ia mengkompilasi sesuatu, itu tidak dijamin sesuai standar, itulah masalah yang saya lihat dalam pengujian tersebut. - person passing_through   schedule 01.02.2020std::pair
adalah POD, jadi container apa pun denganstd::pair
sebagai anggotanya tidak akan berfungsi dengan tipe yang tidak lengkap. Satu pengecualian menarik untuk ini adalahunion
di mana alokasi ada di tumpukan tetapi hanya anggota pertama dari daftar gabungan yang harus bertipe lengkap. Yang lain mungkin tidak lengkap. Jika saya ingat,std::optional
mengeksploitasi properti ini. - person cplusplusrat   schedule 01.02.2020std::pair
itu sendiri, bukan anggotanya. Seperti tipe lainnya,std::pair
itu sendiri dapat berada di stack atau heap. Saya menyebutkan hal itu karena beberapa kalimat pertama dalam komentar yang saya balas membuatnya terdengar seolah-olahstd::pair
bersikap sepele menghalangistd::unordered_map
menerima tipe yang tidak lengkap, yang sejauh yang saya tahu tidak demikian. - person walnut   schedule 02.02.2020