2012-11-26 81 views
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的整个定义存在?

回答

2

我觉得我错过了你的问题。

在这个例子中只有一个正文(“.cpp”)文件,所以它在那里。更确切地说,它与析构函数一样进入相同的目标文件(“.o”,“.obj”等)。语言标准没有具体说明,但这就是我熟悉的所有实现。

+0

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