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
的整个定义存在?
我的问题与我的思维过程有很大关系。我试图从实际的源文件而不是翻译单元中理解它(正如你正在解释的那样)。如果另一个翻译单元包含相同的Foo.h文件(包含上面的代码),它将不需要scoped_ptr的析构函数,因为头文件中没有内容会使用它。所以你通过翻译单位来考虑它,帮助我理解了这一点:) –