On 9/7/07, Brad Ryder <bradryder67_at_[hidden]> wrote:
> typedef boost::shared_ptr<A> shPtrA;
> typedef boost::shared_ptr<B> shPtrB;
> typedef boost::shared_ptr<C> shPtrC;
>
> class A
> {
>
> void AddChild(shPtrA& child);
> private:
> std::vector<shPtrA> m_children;
> }
>
> class B : public A
> {
>
> }
>
> class C: public B
> {
>
> }
>
> main()
> {
> A base;
> shPtrB spB(new B());
> shPtrC spC(new C());
>
> // I dont want to typecast spB or spC
>
> A.AddChild( (shPtrA) spB);
> A.AddChild( (shPtrA) spC);
> }

Hello,

I am also new to the list, and saw your question in the archives.

You don't need to use static_pointer_cast<> or limit yourself to using base class shared_ptr<>s, as has been suggested.

The solution is to pass by value instead of by reference.  Then the compiler has a chance to perform an implicit conversion from one shared_ptr type to another.  In other words, just remove the "&" from the signature of AddChild().

void AddChild(shPtrA child);

The conversion won't occur when you pass by reference because shPtrB does not inherit from shPtrA.

HTH
-Dan