c++ - 转发没有类声明的 shared_ptr

标签 c++ boost c++11

注意:我发现错误的来源实际上与 shared_ptr 无关,只是在错误消息中巧妙地伪装成这样。因此下面基本上是废话(不是答案,他们很好)

--

我在使用 shared_ptr(目前正在 boost )时遇到了一些问题,我需要简单地将指针转发到另一个函数。使用 native 指针,干预函数不需要访问类的定义,但使用 smart_ptr 似乎可以访问。有什么办法可以避免这种情况吗?

例如,给定一个目标函数:

void func( shared_ptr<SomeClass> const & obj )

const & 解决了部分问题,但是假设我们有一个 getter 类,它为其他类获取对象,例如:

shared_ptr<SomeClass> someClassInstance();

这里是我想简单地组装参数并转发给目标函数的地方:

func( someClassInstance() );

使用普通指针,代码中的这一点可以简单地使用 SomeClass 的前向声明,但是使用 smart_ptr 它需要有完整的定义(大概是smart_ptr 可能需要删除类)。

现在,如果 someClassInstance 返回一个 const &,这个问题实际上就会消失,因为中间代码不会复制任何对象。但是,出于线程安全原因,getter 函数必须返回拷贝。

有没有办法实现这种不需要类定义的智能指针参数转发?也就是说,在这种情况下,我能否像使用传统指针一样使用智能指针。

--

更新:编写一个小测试答案是正确的前向声明就足够了。然而,在一种情况下,GCC 仍在提示。我将不得不找出导致它失败的确切原因(在这种特殊情况下)。

我是暂时关闭这个问题,还是怎样?

最佳答案

您至少需要对 T 进行前向声明每次提到 shared_ptr<T> .

仅当您使用一元 shared_ptr::operator* 时和 shared_ptr::operator-> ,需要完整的东西。在引擎盖下,shared_ptr混合使用编译时多态性和运行时多态性,使这成为可能。另见 this question了解“魔法”。

例子:

// frob.h
#ifndef FROB_H
#define FROB_H

#include <shared_ptr>

class Foo;
void grind (std::shared_ptr<Foo>);

#endif

请注意传递 shared_ptr 的规范方式按值计算(即删除 const& )。

关于c++ - 转发没有类声明的 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6523292/

相关文章:

c++ - 有没有跨平台持续集成的工具(c++ Win32和linux)

c++ - 使用 boost 进程获取 shell 命令的标准输出

C++(11) "High Performance"并发单个写入器

c++11 - 返回统一的初始化引用是否有效?

c++ - 为什么 vector::push_back 有两个重载?

c++ - constexpr 函数和硬编码参数

c++ - 在Solaris 9上安装Git

c++ - 如何在我的 DLL 中调用我的 exe 中定义的函数?

c++ - 将文本文件存储到类中

c++ - 如何将 boost::posix_time::ptime 与毫秒进行比较?