2

のようなスマートポインタで不完全な型を使用するboost::scoped_ptrには、対応するCPPファイルで親クラスの空のデストラクタを明示的に定義する必要があります。例:

// H file
class Foo
{
public:
  ~Foo();

private:
  class Pimpl;
  boost::scoped_ptr<Pimpl> pimpl_;
};

// CPP file
class Foo::Pimpl {};

Foo::~Foo() {}

boost::scoped_ptrコンパイラは、のデストラクタのインスタンス化を正確にどこに配置しますか?scoped_ptrのデストラクタを自分で明示的に定義したかのように、これらのソースファイルのいずれかのどこにあるかを視覚的に想像しようとしています。このように想像するのは合理的ですか?

テンプレートメソッドとクラスは、その型で使用されるまでインスタンス化されないことは知っていますが、今は構造的に考えており、コンパイラが実際に手書きした場合にどこに配置するかを考えています。これは、そのような手法(上記のような手法)をどのように使用できるかをよりよく理解するのに役立ちます。

また、テンプレートクラスの定義全体がインスタンス化されているのか、それともその関連部分のみが使用されているのかはわかりません。言い換えれば、boost::scoped_ptrの定義全体の一部だけが存在することは可能ですか?

4

1 に答える 1

2

あなたの質問から何かが欠けているように感じます。

この例では本体 (「.cpp」) ファイルが 1 つしか使用されていないため、そこに移動します。より正確には、そのデストラクタと同じオブジェクト ファイル (「.o」、「.obj」など) に入ります。言語標準はこれを指定していませんが、私がよく知っているすべての実装はそうしています。

于 2012-11-26T20:16:16.440 に答える