为了使用带有智能指针(如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
的整个定义可能存在吗?
答案 0 :(得分:2)
我觉得我错过了你的问题。
在这个例子中只使用了一个正文(“.cpp”)文件,因此它就在那里。更确切地说,它与析构函数一样进入相同的目标文件(“。o”,“。obj”等)。语言标准没有指定这一点,但这就是我熟悉的所有实现的方式。