std::unique_ptr 的不完整型別障礙
使用不完整型別的 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_; // compilation failure };
遇到有關不完整類型的編譯錯誤,因為std::unique_ptr 需要完整的類型定義。
揭示根本原因:破壞缺陷
儘管std::unique_ptr 和不完整類型之間存在預期的兼容性,但問題源於缺少析構函數聲明。編譯器產生的預設建構函式需要完整聲明已實現的類別。
要修正此問題,請在外部類別中明確定義析構函數,以確保其在已實現的類別完成時可用:
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;" };
模板建構子的注意事項
定義模板建構子會使事情變得複雜,即使實現的成員未初始化:
template <typename T> foo::foo(T bar) { // Compiler requires knowledge of impl_ destruction in case of exceptions }
命名空間等級限制
在命名空間範圍內使用帶有不完整類型的std::unique_ptr也會帶來挑戰:
class impl; std::unique_ptr<impl> impl_;
編譯器需要知道如何銷毀靜態持續時間物件。補救措施在於將 std::unique_ptr 包裝在具有定義的析構函數的自訂結構中:
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement with an empty body } impl_;
以上是為什麼 `std::unique_ptr` 因類型不完整而失敗,以及如何修復它?的詳細內容。更多資訊請關注PHP中文網其他相關文章!