c – 转发一个没有类声明的shared_ptr

前端之家收集整理的这篇文章主要介绍了c – 转发一个没有类声明的shared_ptr前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
注意:我发现错误的源码实际上并不与shared_ptr相关,只是在错误消息中巧妙地伪装成这样.因此下面基本上是废话(不是答案,他们很好)

我在使用shared_ptr(boost的时候)有一些麻烦,我需要简单地将指针转发到另一个函数.使用本地指针,intervening函数不需要访问类的定义,但是使用smart_ptr它似乎是.有什么办法可以避免吗?

例如,给定目标函数

void func( shared_ptr<SomeClass> const & obj )

常数&照顾部分问题,但是说我们有一个getter类可以获取其他类的对象,如:

shared_ptr<SomeClass> someClassInstance();

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

func( someClassInstance() );

使用一个简单的指针,代码中的这一点可以简单地使用SomeClass的前向声明,但是使用smart_ptr需要具有完整的定义(可能是因为smart_ptr可能需要删除该类).

现在,如果someClassInstance要返回一个const&这个问题实际上会消失,因为插入的代码不会复制任何对象.但是,为了线程安全的原因,getter函数必须返回副本.

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

更新:写一个小测试的答案是正确的,前向声明是足够的.然而,海湾合作委员会仍然抱怨一种情况.我将不得不弄清楚导致它失败的原因(在这种特殊情况下).

现在关闭这个问题,还是什么?

解决方法

每次提到shared_ptr< T>至少需要一个T的前向声明.

只有使用unary shared_ptr :: operator *和shared_ptr :: operator-&gt,才需要完整的事情.在引擎盖下,shared_ptr使用compiletime和runtime-polymorphism的混合,使之成为可能.另见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&C++相关文章