C++ 通过派生类的Boost shared_ptr

C++ 通过派生类的Boost shared_ptr,c++,boost,shared-ptr,derived-class,C++,Boost,Shared Ptr,Derived Class,所以我有这样的想法 class baseclass { .... } class derived : public baseclass { ... } void func(boost::shared_ptr<baseclass>& a){ //stuff } boost::shared_ptr<derived> foo; func(foo); 类基类{ .... } 派生类:公共基类{ ... } void func(boost::shared_ptr&

所以我有这样的想法

class baseclass {
....
}

class derived : public baseclass {
...
}

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

boost::shared_ptr<derived> foo;

func(foo);
类基类{
....
}
派生类:公共基类{
...
}
void func(boost::shared_ptr&a){
//东西
}
boost::共享\u ptr foo;
func(foo);
这样行吗?我假设不是因为它不是同一个类型,但是我没有能力将它转换为正确的类型,所以有没有什么可以让你想到的工作可以让它工作

编辑:据我所知,我无法进行转换的原因是因为我正在对类型为
boost::shared\u ptr
的向量进行排序,所以我只使用vec.begin()和vec.end()调用sort

shared_ptr
可以隐式转换为
shared_ptr
,只要
T*
可以隐式转换为
U*
。特别是,
shared_ptr
可以隐式转换为
shared_ptr
,也可以隐式转换为
shared_ptr
,其中U是
T
的可访问基础,也可以隐式转换为
shared_ptr

但是,由于您的代码现在无法运行。
boost::shared_ptr
对象的隐式构造必须绑定到一个const引用,或者被复制以保持在构造之外

考虑其中之一

void func(boost::shared\u ptr a)


void func(const boost::shared\u ptr&a)
是的,它会工作。仅仅编译它不比在这里询问更快吗


shared\u ptr
有一个模板化的转换构造函数,它允许从
shared\u ptr
shared\u ptr
的隐式转换,如果(并且仅当)
D*
隐式转换为
B*
我会非常惊讶。您需要传递正确类型的左值。为了实现这一点,类应该是基类,但事实并非如此


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

但以这种方式创建的临时函数是否会愉快地绑定到&?它是否会在封面下进行动态转换以实现此目的?所以它会进行类型检查还是静态转换?@BalogPal,哎呀,我错过了
&
,尽管另一个答案上的注释表明它是一个
常量&
,所以临时的work@legion,这是一个隐式转换,您不需要对派生到基的转换进行类型检查,它总是有效的!很抱歉,我的代码中确实有const,我只是没有把它放在这里。使用const&它可以工作,但是请注意,它涉及临时性的,因此会上下颠簸refcount,这与使用匹配类型不同。