Rumah >pembangunan bahagian belakang >C++ >Mengapa `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap, dan Bagaimana Saya Boleh Membetulkannya?
Halangan Jenis Tidak Lengkap untuk std::unique_ptr
Menggunakan std::unique_ptr dengan jenis yang tidak lengkap menimbulkan kebimbangan kompilasi. Apabila menggunakan simpulan bahasa pimpl dengan std::unique_ptr, kod yang menyerupai yang berikut mungkin mencetuskan isu sedemikian:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // compilation failure };
Ralat kompilasi mengenai jenis yang tidak lengkap ditemui, kerana std::unique_ptr menjangkakan definisi jenis yang lengkap.
Menyingkap Punca Punca: Kemusnahan Kekurangan
Walaupun dijangkakan keserasian antara std::unique_ptr dan jenis tidak lengkap, masalahnya berpunca daripada kekurangan pengisytiharan pemusnah. Pembina lalai yang dijana oleh pengkompil memerlukan pengisytiharan lengkap kelas yang dilaksanakan.
Untuk membetulkan isu ini, tentukan secara eksplisit pemusnah dalam kelas luar, memastikan ketersediaannya apabila kelas yang dilaksanakan selesai:
class foo { class impl; std::unique_ptr<impl> impl_; public: foo(); // May require a default constructor defined elsewhere ~foo(); // Implement with an empty body or use "= default;" };
Kaveat dengan Templat Pembina
Mentakrifkan pembina templat merumitkan perkara, walaupun ahli yang dilaksanakan dibiarkan tanpa dimulakan:
template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction in case of exceptions }
Sekatan Peringkat Ruang Nama
Menggunakan std::unique_ptr dengan jenis yang tidak lengkap pada skop ruang nama juga berpose cabaran:
class impl; std::unique_ptr<impl> impl_;
Pengkompil perlu tahu cara memusnahkan objek tempoh statik. Penyelesaian terletak pada membungkus std::unique_ptr dalam struct tersuai dengan pemusnah yang ditentukan:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement with an empty body } impl_;
Atas ialah kandungan terperinci Mengapa `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap, dan Bagaimana Saya Boleh Membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!