將std::unique_ptr 與不完整類型一起使用
在pimpl 習慣用法中,將std::unique_ptr 與不完整類型一起使用可能會導致編譯錯誤。考慮以下程式碼:
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
錯誤通常是由於嘗試在不完整類型上使用 sizeof 引起的,如
問題
問題源自於這樣一個事實:編譯器需要知道不完整類型的大小來決定 std:: unique_ptr。此資訊不可用,導致編譯錯誤。
解決方案
要解決此問題,必須為保存 unique_ptr 的類別實現析構函數。這是因為編譯器產生的預設析構函數需要完整的型別宣告。以下是一個範例:
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 };
透過實作析構函數,編譯器獲得了處理 unique_ptr 銷毀所需的知識。
特殊情況
在某些場景下,使用不完整類型的 unique_ptr可能不可行可能:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
透過遵循這些準則,您可以有效地使用不完整類型的unique_ptr,確保編譯過程順利。
以上是如何在 C 中將 `std::unique_ptr` 與不完整型別一起使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!