不完全型コンパイル エラーのある std::unique_ptr
std::unique_ptr クラスは、オブジェクトの有効期間を管理するように設計されています。完全型と不完全型の両方で使用できます。ただし、以下のコード スニペットに見られるように、不完全な型で std::unique_ptr を宣言しようとすると、
class window { window(const rectangle& rect); private: class window_impl; // defined elsewhere std::unique_ptr<window_impl> impl_; // won't compile };
不完全な型の使用に関するコンパイル エラーが発生する可能性があります。このエラーは、std::unique_ptr で pimpl を使用する場合、デストラクターを宣言する必要があるという事実に起因します。
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 };
デストラクターが明示的に宣言されていない場合、コンパイラーはデフォルトのデストラクターを生成します。これには完全なデストラクターが必要です。 foo::impl クラスの宣言。これにより、不完全な型を操作するときにコンパイル エラーが発生する可能性があります。
この問題を解決するには、上記のコード スニペットに示すように、空の本体を使用するか、デフォルトに設定して、クラスのデストラクターを実装します。これにより、コンパイラは std::unique_ptr によって管理されるオブジェクトの破棄を適切に処理できるようになります。
さらに、不完全な型での std::unique_ptr の使用は、名前空間スコープではサポートされません。代わりに、以下のコード スニペットに示すように、デストラクターを提供するカスタム構造体内で std::unique_ptr をラップすることで回避策が利用できます。
class impl; struct ptr_impl : std::unique_ptr<impl> { ~ptr_impl(); // Implement (empty body) elsewhere } impl_;
以上が不完全な型で `std::unique_ptr` を使用するとコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。