繁体   English   中英

通过共享类来增强shared_ptr

[英]Boost shared_ptr passing a derived class

所以我有这样的事情

class baseclass {
....
}

class derived : public baseclass {
...
}

void func(boost::shared_ptr<baseclass>& a){
//stuff
}

boost::shared_ptr<derived> foo;

func(foo);

这样行吗? 我假设不是因为它不是同一类型,但是我不具备将其转换为正确类型的能力,因此您是否可以想到有任何解决方法可以使它起作用?

编辑:之所以无法对我的知识进行转换是因为我正在对类型为boost::shared_ptr<derived>的向量进行排序,所以我只使用vec.begin()和vec.end( )

只要T*可以隐式转换为U*就可以将shared_ptr<T>隐式转换为shared_ptr<U> 特别是, shared_ptr<T>可以隐式转换为shared_ptr<T const> ,也可以隐式转换为shared_ptr<T const> shared_ptr<U> ,其中U是T的可访问基数,也可以隐式转换为shared_ptr<void>

http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm#Members

但是,由于您的代码现在不起作用。 boost::shared_ptr<baseclass>对象的隐式构造必须绑定到const引用,或者被复制以持久地进行构造。

考虑两者之一

void func(boost::shared_ptr<baseclass> a)

要么

void func(const boost::shared_ptr<baseclass>& a)

是的,它将起作用。 只是编译它比在这里问要快吗?

shared_ptr具有模板化的转换构造函数,该构造函数允许在(且仅当) D*可隐式转换为B*shared_ptr<D>shared_ptr<B>隐式转换B*

我会非常惊讶。 您需要传递适当类型的左值。 为此,该类应该是基类,事实并非如此。

注意:如果您的函数按值或const&取ptr,则适用其他规则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM