c++ - 什么翻译单元拥有隐式定义的特殊成员函数?

标签 c++

我在头文件中使用 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/

相关文章:

c++ - 在工作线程上运行的 WebKit

c++ - GCC 内部编译器错误 : Segmentation fault

c++ - 类型未推断为右值引用 : why not?

c++ - 通过链接实现静态或全局的多个实例

c++ - TinyXml : Read wstring from XML file

c++ - 在 C++ 中是否允许在 iostream 之后编写任何内容

c++ - 为什么在使用<set>迭代器时不能使用成员函数获取成员变量?

c++ - 尝试只插入单词的第一个字母,而不是整个单词

c++ - 处理大量接口(interface)实现的正确方法是什么?

c++ - 似乎无法通过艰难的方式倍增