不完全な型で 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 };
エラーは通常、
問題
この問題は、コンパイラが 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 中国語 Web サイトの他の関連記事を参照してください。