2

所以我有类似的东西

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

4

3 回答 3

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)

于 2013-06-04T16:09:05.093 回答
1

是的,它会起作用。编译它不是比在这里问更快吗?

shared_ptr有一个模板化的转换构造函数,当(且仅当)可以隐式转换为时,它允许隐式转换shared_ptr<D>shared_ptr<B>D*B*

于 2013-06-04T16:10:06.467 回答
1

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

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

于 2013-06-04T16:11:00.933 回答