所以我有类似的东西
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调用sort ()
答案 0 :(得分:4)
每当shared_ptr<T>
可以隐式转换为shared_ptr<U>
时,
T*
就可以隐式转换为U*
。特别是,shared_ptr<T>
可以隐式转换为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)
答案 1 :(得分:1)
是的,它会起作用。编译它不是比在这里问的更快吗?
shared_ptr
有一个模板化转换构造函数,允许从shared_ptr<D>
到shared_ptr<B>
的隐式转换,如果(且仅当)D*
可隐式转换为B*
< / p>
答案 2 :(得分:1)
我会非常惊讶。你需要传递适当类型的左值。为了使它工作,这个类应该是基类,而事实并非如此。
注意:如果你的函数将ptr取值或const&amp;其他规则也适用。