2

boost::scoped_ptrヘッダーファイルで前方宣言を使用しています。

//Bar.h
class Foo;

class Bar;
{

private:
    boost::scoped_ptr<Foo> _foo;
};

スマートポインタがその仕事をするので、私は自分のデストラクタを実装しません。

このヘッダーファイルを複数の翻訳単位にインクルードしましたが、すべてにFoo定義が含まれているわけではありません。コンパイルしようとすると、scoped_ptr不完全な型へのポインタを削除するというエラーが発生しますFoo

で空のデストラクタを宣言し、Bar.hで実装すると、すべてが簡単に修正されBar.cppます。

ただし、デストラクタがヘッダーファイルに実装されている場合は、同じエラーが発生します。

したがって、問題は、暗黙的に定義されたメソッドがどの変換ユニットに入るのかということです。

4

2 に答える 2

4

質問は正しく定式化されていません。あなたが知りたいのは

どの翻訳単位が暗黙的に定義された特別なメンバー関数を保持しますか?

[それは一口です]。そして、その答えは、それらを使用する(odr-uses)すべての翻訳ユニットにあります

特定のユースケースでは、scoped_ptrデストラクタは型が完全である必要があるため、のデストラクタを宣言しBar、完全な定義を持つ変換ユニットで空の場合でもそれを定義する以外に選択肢はありませんFoo

または、その制限のない別のタイプのスマートポインタを使用することもできます。

于 2012-08-13T13:13:58.723 に答える
4

したがって、問題は次のとおりです。ヘッダーで実装されたメソッドはどの変換ユニットに組み込まれますか?

それらのすべてで。つまり、各TUは独自の(インライン)実装を取得します。

明らかにデストラクタはの定義を持っている必要があるため、ここでエラーが発生しますFoo。これは、デストラクタが定義されている場所に関係ありません。独自のTUで定義する場合でも、そのTUはの定義を知っている必要がありFooます。

于 2012-08-13T13:14:04.140 に答える