Rumah > pembangunan bahagian belakang > C++ > Mengapakah Menggunakan `std::unique_ptr` dengan Jenis Tidak Lengkap Menyebabkan Ralat Penyusunan?

Mengapakah Menggunakan `std::unique_ptr` dengan Jenis Tidak Lengkap Menyebabkan Ralat Penyusunan?

Mary-Kate Olsen
Lepaskan: 2024-12-04 09:58:16
asal
248 orang telah melayarinya

Why Does Using `std::unique_ptr` with an Incomplete Type Cause a Compile Error?

std::unique_ptr dengan Ralat Penyusun Jenis Tidak Lengkap

Kelas std::unique_ptr direka bentuk untuk mengurus jangka hayat objek dan ia boleh digunakan dengan kedua-dua jenis lengkap dan tidak lengkap. Walau bagaimanapun, apabila cuba mengisytiharkan std::unique_ptr dengan jenis yang tidak lengkap, seperti yang dilihat dalam coretan kod di bawah:

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};
Salin selepas log masuk

ralat penyusunan mengenai penggunaan jenis yang tidak lengkap mungkin berlaku. Ralat ini berpunca daripada fakta bahawa apabila menggunakan pimpl dengan std::unique_ptr, pemusnah mesti diisytiharkan:

class foo {
  class impl;
  std::unique_ptr<impl> impl_;

public:
  foo(); // You may need a def. constructor to be defined elsewhere

  ~foo(); // Implement (with {}, or with = default;) where impl is complete
};
Salin selepas log masuk

Jika pemusnah tidak diisytiharkan secara eksplisit, pengkompil menjana satu lalai, yang memerlukan pemusnah yang lengkap pengisytiharan kelas foo::impl. Ini boleh membawa kepada ralat penyusunan apabila bekerja dengan jenis yang tidak lengkap.

Untuk menyelesaikan isu ini, laksanakan pemusnah untuk kelas, sama ada dengan badan kosong atau dengan menetapkannya kepada lalai, seperti yang dilihat dalam coretan kod di atas. Ini akan memastikan bahawa pengkompil boleh mengendalikan pemusnahan objek yang diuruskan oleh std::unique_ptr dengan betul.

Selain itu, menggunakan std::unique_ptr dengan jenis yang tidak lengkap tidak disokong pada skop ruang nama. Sebaliknya, penyelesaian tersedia dengan membungkus std::unique_ptr dalam struct tersuai yang menyediakan pemusnah, seperti yang ditunjukkan dalam coretan kod di bawah:

class impl;
struct ptr_impl : std::unique_ptr<impl> {
  ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah Menggunakan `std::unique_ptr` dengan Jenis Tidak Lengkap Menyebabkan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan