This is normal behaviour for a pointer too, so shared_ptr is correct to disallow this : void AddObject(CBase&* pObj); ... CDerived* pDerived = 0;. AddObject(p); // also won't compile If you think about it this makes sense. Imagine, if that behaviour were allowed this would cause some problems: class CDerived2 : public CBase {}; void AddObject(CBase&* pObj) { pObj = new CDerived2; } ... CDerived* pDerived = 0; AddObject(pDerived); // eeek! pDerived now points to a CDerived2 object! Normally in this situation I would return a shared_ptr<> rather than take one by reference. (I prefer that style anyway, but lets not get into that :-) ). You will then have to do a cast to the derived object ptr: BasePtr AddObject(); ... BasePtr p = AddObject(); if (DerivedPtr pDerived = shared_dynamic_cast<CDerived>(p)) { // ... } HTH Sam Drew wrote:
To be a little more detailed, here is what I am trying to accomplish:
typedef boost::shared_ptr<CBase> BasePtr; typedef boost::shared_ptr<CDerived> DerivedPtr;
AddObject(pBase); // works AddObject(pDerived); // does not work
void AddObject(BasePtr& pObj) { std::vector<BasePtr>::iterator pos = find(myList.begin(), myList.end(), 5);
if (pos != myList.end()) { pObj= *pos; } else { myList.push_back(pObj); } }
error C2664: 'Fn' : cannot convert parameter 1 from 'DerivedPtr' to 'ParentPtr &' A reference that is not to 'const' cannot be bound to a non-lvalue
However,
AddObject(base); // works AddObject(derived); // works
void AddObject(CBase& base) { }
This is a generic function that adds an element if it does not exist.
Why when I use a shared_ptr does this not work?
I dont want a specific lookup for all of my objects.
Thanks guys...