注意:我发现错误的来源实际上与 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/