我在头文件中使用 boost::scoped_ptr
和前向声明:
//Bar.h
class Foo;
class Bar;
{
private:
boost::scoped_ptr<Foo> _foo;
};
我没有实现自己的析构函数,因为智能指针会完成这项工作。
我将这个头文件包含在多个翻译单元中,但并非所有翻译单元都包含 Foo
定义。尝试编译时出现错误,提示 scoped_ptr
正在删除指向不完整类型 Foo
的指针。
如果我在 Bar.h
中声明一个空析构函数并在 Bar.cpp
中实现它,一切都会很容易修复。
但是,如果在头文件中实现析构函数,我会得到同样的错误。
所以问题是:隐式定义的方法在哪些翻译单元中运行?
最佳答案
问题的表述不正确。你想知道的是
哪个翻译单元包含隐式定义的特殊成员函数?
[那是一口]。答案就在每个使用(odr-使用)它们的翻译单元中。
对于您的特定用例,并且因为 scoped_ptr
析构函数需要完整的类型,您别无选择,只能声明 Bar
的析构函数,并定义它即使在具有 Foo
完整定义的翻译单元中为空。
或者,您可以使用没有该限制的不同类型的智能指针。
关于c++ - 什么翻译单元拥有隐式定义的特殊成员函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11934897/