首頁 >後端開發 >C++ >為什麼 `std::unique_ptr` 因類型不完整而失敗,以及如何修復它?

為什麼 `std::unique_ptr` 因類型不完整而失敗,以及如何修復它?

Linda Hamilton
Linda Hamilton原創
2024-12-08 01:29:16972瀏覽

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

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn