1. ホーム
  2. c++

[解決済み] unique_ptrを使った前方宣言?重複

2023-04-16 19:11:09

質問

と組み合わせてクラスの前方宣言を使用すると便利です。 std::unique_ptr を組み合わせて使うと便利なことがわかりました。GCCでコンパイルして動くのですが、全体的になんだか変な感じで、これは標準的な動作なのでしょうか(つまり、標準が要求している)?Bは完全な型ではないので、私が unique_ptr .

A.hpp

#include <memory>

class B;

class A {
    std::unique_ptr<B> myptr;
    // B::~B() can't be seen from here
public:
    ~A();
};

A.cpp

#include "B.hpp"
//B.hpp has to be included, otherwise it doesn't work.

A::~A() = default; // without this line, it won't compile 
// however, any destructor definiton will do.

これはデストラクタと関係があるのではないかと思います(そのため、デストラクタを呼び出すために unique_ptr<B> )が特定のコンパイル単位(A.cpp)で定義されていることです。

どのように解決するのですか?

明示的に合法です。 ルールは、標準ライブラリのテンプレートをインスタンス化するために使用する型は は完全でなければなりません。 でない限り でなければ と指定されています。 の場合は unique_ptr の場合、§20.7.1/5に"[...] The template parameter T of unique_ptr may be incomplete type "とあります。 unique_ptrのテンプレートパラメータTは不完全な型である可能性があります。"

ポインタの操作には、完全な型が必要なものがあります。 特に、オブジェクトが実際に破壊されるとき(少なくともデフォルトのdeleterでは) 特に、オブジェクトが実際に破壊されるとき (少なくともデフォルトのデレッタで)。 あなたの例では、例えば、もし A::~A() がインラインであった場合、これは問題を引き起こすかもしれません。 (ただし、もしあなたが デストラクタを自分で宣言しない場合は、インラインになることに注意してください。 これは を使う目的を部分的に破ってしまいます。 std::unique_ptr .)