のようなスマートポインタで不完全な型を使用する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
の定義全体の一部だけが存在することは可能ですか?