[英]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.