注意:我发现错误的源码实际上并不与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->,才需要完整的事情.在引擎盖下,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