From: "Olaf Petzold"
Thank you,
struct C : public BaseC { C() : b( new B("C::b") ) { } void set(const boost::shared_ptr<A>& ptr) { b.swap( boost::shared_static_cast<B>( ptr ) ); // L21 } void print() { std::cout << b->name << std::endl; } boost::shared_ptr<B> b; };
Why not simply
b = boost::shared_static_cast<B>( ptr );
or
b = boost::shared_polymorphic_cast<B>( ptr );
I want to swap the pointers inside for further use (for saving the old ptr contents and restoring for circumstances - clone() may be one way before set() it but has overhead).
You can't swap() two pointers (objects, in general) of different types, and you can't swap() with a temporary (which is what the cast returns.) One possible way is to change set() to return the old value: shared_ptr<A> set(shared_ptr<A> const & p) { shared_ptr<A> tmp(b); b = boost::shared_polymorphic_cast<B>(p); return tmp; } You can keep the old interface (minus the "const" on the parameter) if you want, but the swapping needs to be done "by hand": void set(shared_ptr<A> & p) { shared_ptr<A> tmp(b); b = boost::shared_polymorphic_cast<B>(p); p = tmp; }