【问题标题】:Where are template methods instantiated?模板方法在哪里实例化?
【发布时间】:2012-11-26 19:46:31
【问题描述】:

为了使用带有智能指针的不完整类型,例如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的整个定义是否可能只存在一部分?

【问题讨论】:

    标签: c++ templates boost


    【解决方案1】:

    我觉得我从你的问题中遗漏了一些东西。

    本例中只使用了一个主体 (".cpp") 文件,所以它放在那里。更准确地说,它与析构函数进入同一个目标文件(“.o”、“.obj”等)。语言标准没有规定这一点,但我熟悉的所有实现都是这样做的。

    【讨论】:

    • 我的问题与我的思考过程有很大关系。我试图用实际的源文件而不是翻译单元来理解它(正如你所解释的那样)。如果另一个翻译单元包含相同的 Foo.h 文件(包含上面的代码),它将不需要 scoped_ptr 的析构函数,因为头文件中的任何内容都不会使用它。所以你通过翻译单位来思考它,帮助我理解了这一点:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多