2

boost::scoped_ptr在头文件中使用和前向声明:

//Bar.h
class Foo;

class Bar;
{

private:
    boost::scoped_ptr<Foo> _foo;
};

我没有实现自己的析构函数,因为智能指针会完成这项工作。

我将此头文件包含在多个翻译单元中,但并非所有翻译单元都包含Foo定义。尝试编译时出现错误,scoped_ptr正在删除指向不完整类型的指针Foo

如果我声明一个空的析构函数Bar.h并在Bar.cpp.

但是,如果析构函数是在头文件中实现的,我会遇到同样的错误。

所以问题是:隐式定义的方法在哪些翻译单元中使用?

4

2 回答 2

4

问题的表述不正确。你想知道的是

哪个翻译单元包含隐含定义的特殊成员函数?

[那是一口]。答案就在每个使用(odr-uses)它们的翻译单元

对于您的特定用例,并且由于scoped_ptr析构函数要求类型是完整的,您别无选择,只能声明 的析构函数Bar,并在具有完整定义的翻译单元中定义它,即使它为空Foo

或者,您可以使用没有该限制的不同类型的智能指针。

于 2012-08-13T13:13:58.723 回答
4

所以问题是:标头实现的方法在哪些翻译单元中执行?

在所有这些中。也就是说,每个 TU 都有自己的(内联)实现。

你会在这里得到错误,因为显然析构函数需要定义Foo. 这与定义析构函数的位置无关。如果你在它自己的 TU 中定义它,那么那个 TU 仍然需要知道Foo.

于 2012-08-13T13:14:04.140 回答