2017-02-23 61 views
0

我很惊讶,编译器拒绝编译这样的代码:如何动态地转换boost :: scoped_ptr?

class A { virtual ~A() {} }; 
class B : public A { virtual ~B() {} void foo() {} }; 
//... 
boost::scoped_ptr<A> p1(new B); 
boost::scoped_ptr<B> p2 = boost::dynamic_pointer_cast<B>(p1); 
p2->foo(); 

为什么这是不可能的?什么是最好的方式来做到这一点?

我发现这个解决方案:

boost::scoped_ptr<A> p1(new B); 
B* p2 = dynamic_cast<B*>(p1.get()); 
p2->foo(); 

有只使用智能指针的方法吗?

注意:为了兼容性原因,我不使用C++ 11。

+0

'boost :: scoped_ptr'不允许共享或转让所有权 – Praetorian

回答

1

p1拥有B对象,并将在其析构函数中将其删除。如果您允许创建第二个智能指针(p2),该智能指针也将删除其析构函数中的对象,则会出现问题。

就我个人而言,我会使用一个强制转换而不是一个指针,但除此之外,你已经找到了唯一的解决方案。