为什么unique_ptr::~unique_ptr需要T的定义?

2024-04-21

如果我有一堂“酒吧”课:

// bar.h
class Bar
{
public:

    Bar() { }
};

我转发声明与另一个类“Foo”中的 std::unique_ptr 一起使用:

// foo.h
#include <memory>

class Bar;

class Foo
{

public:

    Foo();

private:

    std::unique_ptr<Bar> bar_;
};

我将其定义包含在 Foo 的实现文件中:

// foo.cpp
#include "foo.h"
#include "bar.h"

Foo::Foo()
: bar_(new Bar)
{ }

我收到编译时错误“‘sizeof’对不完整类型‘Bar’的无效应用”。

我的理解是从here https://stackoverflow.com/questions/6012157/is-stdunique-ptrt-required-to-know-the-full-definition-of-t and here http://www.codesynthesis.com/~boris/blog/2012/04/04/when-provide-empty-destructor/为了解决这个问题,我可以在 foo.h 中声明 Foo 的析构函数,并将其空定义移至 foo.cpp。我不明白的是,为什么会解决这个问题。我读到 std::unique_ptr 有时需要知道其类型的完整定义。如果我必须包含 bar.h 中的 Bar 以便 unique_ptr 看到它的定义,这对我来说是有意义的。但是 Foo 的析构函数与 Bar 的可见性有什么关系,为什么在 foo.h 中声明 ~Foo() 并在 foo.cpp 中定义它会消除错误?


的析构函数unique_ptr<Bar> calls Bar::~Bar当它delete's the Bar它拥有。所以~unique_ptr<Bar>需要看看Bar::~Bar.

但模板方法仅在使用时实例化。

唯一的 ptr 被破坏Foo in Foo::~Foo. If ~Foo生活在可以看到定义的地方~Bar, 一切都很好。

如果你让它由编译器生成,它“存在”在声明中Foo,在它看不到的地方~Bar.

如果您转发声明它,则执行Foo::~Foo() = default or Foo::~Foo() {} in the .cpp之后归档#include <bar.h>,它可以看到~Bar在这一点上~std::unique_ptr<Bar>叫做`,一切都好。

这在实践中很重要,因为如何Bar被破坏取决于是否~Bar是虚拟的,并且如果Bar有父母,如果~Bar是私人/受保护的,拨打电话可能是非法的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么unique_ptr::~unique_ptr需要T的定义? 的相关文章

随机推荐

  • 可调用和泛型的集合

    我需要在并发线程中启动一堆任务并检索其结果 这是我的代码 List
  • 使用正则表达式解析 select 语句(用于自定义 SQL 解析器)

    我这样做是为了教学目的 构建一个教学数据库 构建它的一部分 就像成熟的数据库一样 这是一个非常简单的查询解析器 我正在尝试使用正则表达式解析简单的 选择 语句 它适用于大多数简单的情况 但我在选择表格之间留有空格的平衡中失去了它 从a b
  • 在 Dynamics ax 中读取逗号分隔值 (csv) 文件

    如何在dynamic ax中打开并解析csv文件 static void TestCommaTextIO Args args File CommaTextIo commaTextIo FileIOPermission permission
  • 共享来自多个 Web 参考的数据类型

    假设供应商提供了两个独立的 Web 服务 它们共享相同的数据类型和相同的命名空间 例如 以下 Web 服务都包含类似的对象 例如 TestCredentials 对象 TestWebservice Testwebservice1 asmx
  • 重载>> istream_iterator 对[重复]

    这个问题在这里已经有答案了 我正在尝试在pair上构造一个ifstream iterator 我的代码如下 typedef pair
  • $_POST 参数被修改/截断

    当我将 POST 中的数据发送到 php 脚本时 此帖子数据被截断 修改 我有一个变量 encrypted 使用 Guzzle 或 Curl 发送到一个端点 该端点以 json 形式返回发布数据 例如 echo json encode PO
  • /var/tmp/rpm-tmp.b1DgAt (%build) 的退出状态错误

    我正在尝试编译 Tizen 源代码 编译工具使用rpm构建环境 在编译特定包时 我遇到 rpm 构建问题 var tmp rpm tmp b1DgAt build 的退出状态错误 这是我的构建日志 Building CXX object C
  • 如何将 Pinterest 集成到 ios 应用程序中

    我想整合兴趣在我的应用程序中 我想在我的应用程序中添加 pinterest 按钮 通过它我可以在我提到的 pinterest 上上传图像他们的开发者网站 http developers pinterest com 但这对我没有帮助 我包含了
  • foo() 缺少 1 个必需的位置参数

    class test def foo self pic path enc path key path return pic path enc path key path if name main s test pic path pic pn
  • 边框颜色的CSS复选框样式[重复]

    这个问题在这里已经有答案了 我的表格中有一个复选框 这是该复选框的 CSS input type checkbox width 20px height 30px margin auto display table row border 5p
  • Bootstrap 按钮活动颜色变化

    我正在使用引导按钮类 更具体地说 如下
  • 如何从WebBrowser控件获取图像

    我有一个 WebBrowser 控件 在浏览页面后我需要下载图像 我使用了以下代码 HtmlElementCollection tagsColl webBrowser1 Document GetElementsByTagName img f
  • SQL插入相关表

    在我看来 这似乎是 SQL 数据库开发中经常出现的问题 但我对这一切都是新手 所以请原谅我的无知 我有 2 张桌子 CREATE TABLE dbo Tracks TrackStringId bigint NOT NULL Id bigin
  • 如何从 Node.js 调用 C++ 代码?

    我目前正在开发一个在服务器上运行的模拟器 并应在浏览器中显示数据 对于服务文件 通信和类似的事情 我想使用 Node js 但是 我不确定它在计算部门是否会像我希望的那样执行 所以我想用 C 开发模拟部分 模拟被划分为单独的 世界 它们都以
  • 使用 node-sass 安装 angular-cli 时出错

    我的系统配置 Debian 4 4 nvm 0 33 8 节点 v8 9 4 npm 5 6 0 我想安装 Angular clinpm install g angular cli 但我收到一条错误消息 root contracts hom
  • NugGet Semver - 允许哪些预发行角色?

    我正在尝试对我的 NuGet 包 NET Core 2 之一使用语义版本控制 版本如下 1 0 0 my fancy branch 123 正如您所猜测的 我尝试将分支名称和当前 BuildId 设置为预发布标签 不幸的是 dotnet b
  • MediaCodec.createInputSurface() 在 Android 模拟器中抛出 IllegalStateException(错误 -38)

    I have MediaMuxer MediaMuxer mMediaMuxer new MediaMuxer new File Environment getExternalStorageDirectory video mp4 getPa
  • 在 Shiny 中格式化响应式 data.frames

    我有一个工作闪亮的应用程序 但我正在更改它 以便输入数据是反应性的 当底层数据更新时它会更新 当它刚刚读入数据时 它工作得很好 但现在数据是反应性的 我在其中一个文件上遇到了问题 另外两个文件按预期工作 该文件是从数据库导出的 csv 我想
  • 数据库级别的国际化

    谁能向我指出一些解决数据库级别任务国际化的模式 最简单的方法是为每个文本列的每种语言添加一个文本列 但这在某种程度上有点难闻 我真的希望能够动态添加支持的语言 我要提出的解决方案是保存在模型中的一种主要语言和一个查询翻译并将翻译保存到的字典
  • 为什么unique_ptr::~unique_ptr需要T的定义?

    如果我有一堂 酒吧 课 bar h class Bar public Bar 我转发声明与另一个类 Foo 中的 std unique ptr 一起使用 foo h include