Rumah >pembangunan bahagian belakang >C++ >Mengapa `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa `std::unique_ptr` Gagal dengan Jenis Tidak Lengkap, dan Bagaimana Saya Boleh Membetulkannya?

Linda Hamilton
Linda Hamiltonasal
2024-12-08 01:29:16969semak imbas

Why Does `std::unique_ptr` Fail with Incomplete Types, and How Can I Fix It?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn