将 std::unique_ptr 返回到多态类对象的正确方法

2024-01-05

假设我有以下类层次结构:

struct Base 
{
};

struct Derived : public Base 
{ 
    void DoStuffSpecificToDerivedClass() 
    {
    } 
};

以及以下工厂方法:

std::unique_ptr<Base> factoryMethod()
{
    auto derived = std::make_unique<Derived>();
    derived->DoStuffSpecificToDerivedClass();
    return derived; // does not compile
}

问题是,return语句无法编译,因为std::unique_ptr没有具有协方差支持的复制构造函数(这是有道理的,因为它没有任何复制构造函数),它只有一个具有协方差支持的移动构造函数。

解决这个问题的最佳方法是什么?我可以想到两种方法:

return std::move(derived); // this compiles
return std::unique_ptr<Base>(derived.release()); // and this compiles too

EDIT 1:我使用 Visual C++ 2013 作为编译器。原始错误消息为return derived看起来像这样:

Error   1   error C2664: 'std::unique_ptr<Base,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : cannot convert argument 1 from 'std::unique_ptr<Derived,std::default_delete<Derived>>' to 'std::unique_ptr<Derived,std::default_delete<Derived>> &&'

EDIT 2:它是根据标准 VS 2013 模板全新创建的控制台应用程序。我没有调整任何编译器设置。编译器命令行如下所示:

Debug:

/Yu"stdafx.h" /GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debug\vc120.pdb" /fp:precise /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_LIB" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\CppApplication1.pch" 

Release:

/Yu"stdafx.h" /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc120.pdb" /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_LIB" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\CppApplication1.pch" 

你可以这样做:

return std::move(derived);

这样你就告诉编译器不需要复制,这满足了以下要求unique_ptr。如果类型完美匹配,则不需要显式指定move,但在这种情况下你会这样做。

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

将 std::unique_ptr 返回到多态类对象的正确方法 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • ssis 过滤掉值以字母开头的行

    在 SSIS 项目中 我尝试从 Excel 文件源中筛选出行 其中列的值以字母开头 后跟数字 某些单元格包含多个值 并且并非所有单元格都遵循某种数据类型格式 目前数据流程如下 Excel Source gt Data Conversion
  • Google Drive API - 获取包括文件夹在内的文件列表

    我需要列出用户驱动器云中的所有图像 I use https www googleapis com drive v2 files https www googleapis com drive v2 files使用正确的过滤器来查询所有图像 我
  • inotify 不会在文件修改时触发通知

    我一直在调整这个例子here http www ibm com developerworks linux library l ubuntu inotify index html使其反复监视文件的 修改 我的代码是here http past
  • Fluent NHibernate - 配置 Oracle Data Provider ODP

    我是 NHibernate 和 Fluent NHibernate 的新手 我正在尝试让以下配置正常工作 private static ISessionFactory CreateSessionFactory return Fluently
  • Python 中的正则表达式反向引用问题

    我不知道为什么这不起作用 也许我遗漏了 Python 正则表达式的一些东西 这是我的正则表达式和我希望它匹配的示例字符串 PHONE REGEX lt gt phone EXAMPLE
  • 向传单地图添加任意图像

    我正在尝试使用传单来显示比平时更小的地图 所以我不想使用普通的平铺系统 我不关心平滑缩放和在需要时加载更高分辨率的图块 相反 我尝试从图像文件添加光栅图像 可以这么说当我谷歌 手绘地图 时出现 So I try download file
  • 将角色关联到正在运行的 AWS 实例

    为了运行AWS监控脚本 http docs aws amazon com AmazonCloudWatch latest DeveloperGuide mon scripts perl html http docs aws amazon c
  • 创建 TCP 网络错误以进行单元测试

    我想在测试期间创建各种网络错误 我在 Linux 上直接在 C 中使用 Berkely 套接字 API 我正在 Boost Test 中的另一个线程中运行模拟服务器 该线程在本地主机上侦听 例如 我想在连接期间创建超时 到目前为止 我已经尝
  • 取消图标的亮点

    在编程和查看所有不同的应用程序时 我意识到应用程序商店中的某些应用程序顶部没有亮起的突出显示 使其看起来更具 3D 效果 我有一个应用程序的想法 但我需要去掉重点 该应用程序已在 Xcode 中编程 因此如果有人回答 那就太好了 谢谢 fr
  • C# 中的多媒体定时器中断(前两个中断不好)

    我使用分辨率为 1 毫秒 周期为 10 毫秒的多媒体计时器 问题是多媒体计时器严重中断了前两个事件 因为我得到了 1 ms 的差异 这不是我想要的 public partial class Form1 Form public Form1 I
  • 使用 django-autocomplete-light 添加更多字段时出错

    我有一个问题 我正在使用 2 个库 Django 自动完成灯 and Django 动态表单集 两人都非常擅长完成自己的工作 第一个用于自动完成 第二个用于使 django 表单集动态化 but当你想加入这两个时 就会出现问题 问题的图像
  • 工具栏按钮单击事件功能

    我已经在中创建了设置按钮Toolbar 现在每当我单击设置按钮时 我都需要将屏幕导航到设置屏幕 menu menu
  • 如何淡化 UIImageView 的角/边缘/边框

    我在论坛上找不到这个 所以我决定发布这个 我有一个 UIImageView 其代码如下 可以使图像彼此淡出 void viewDidLoad super viewDidLoad Do any additional setup after l
  • Emacs 23、emacsclient 参数?

    我最近安装了 Emacs 23 在 OS X Leopard 上 并尝试了 emacs 服务器 我尝试了两种方法 1 将 server start 放入我的 emacs文件中 2 在终端运行emacs daemon 在单独的试验中 不是同时
  • 有没有办法获得有关未使用功能的警告?

    我想在代码库中找到未使用的函数 包括跨编译单元 我使用 gcc 作为我的编译器 这是一个例子 foo c 假设适当foo h void foo void bar main c include
  • Capybara 找不到 Semantic-ui 的选择框

    I use capybara with 水豚 webkit and 语义用户界面 但似乎下拉菜单不能开箱即用 因为
  • 在 Python 中使用双线性插值调整大小

    我正在尝试使用双线性插值手动实现调整图像大小 到目前为止 我得到的是插值本身的函数 它似乎工作正常 但调整大小函数似乎仅在角上正常工作 def bilinear interpolation image y x height len imag
  • 有人更改 Visual Studio 默认支撑样式吗? - 有标准吗?

    我发现默认的支撑样式在行数上有点浪费 例如 function foo if else 例如 如果我用 JavaScript 编写 会像这样写 function foo if else 据我了解 这可能也不符合人们的口味 但问题是你是否关闭
  • ECMAScript 2017:为什么 EscapeSequence 包含 NonEscapeCharacter?

    以下摘录参考ECMAScript 2017 https www ecma international org ecma 262 8 0 index html prod EscapeSequence 11 8 4 字符串文字 注释 1 字符串
  • 将 std::unique_ptr 返回到多态类对象的正确方法

    假设我有以下类层次结构 struct Base struct Derived public Base void DoStuffSpecificToDerivedClass 以及以下工厂方法 std unique ptr factoryMet