Boost logo

Boost :

From: Phillip Hellewell (sshock_at_[hidden])
Date: 2006-08-18 14:27:52


Hi,

When using overloaded functions with shared_ptr parameter, overload
resolution is often ambigous. It is ambigous in situations where
using raw pointers would not be ambigous.

I've seen a few workarounds. One workaround is to make one of the two
functions a template function, but that does not work in all cases.
Another workaround is to just give the functions different names, but
you can't do that when the function is a CTOR.

Well, to my surprise, I found a post from Artyom Borodkin from last
December that explains how it can be permanently fixed in boost
itself! I thought there was no way I would ever resolve this.

http://lists.boost.org/Archives/boost/2005/12/97817.php

I went ahead and tested his suggestion by modifying the boost source
(I had to change slightly what he wrote), and it worked!

I changed this constructor:

    template<class Y>
    shared_ptr(shared_ptr<Y> const & r): px(r.px), pn(r.pn) // never throws
    {
    }

to this:

    template<class Y>
    shared_ptr(shared_ptr<Y> const & r, typename enable_if<typename
is_convertible<Y*, T*>::type, void*>::type = 0): px(r.px), pn(r.pn) //
never throws
    {
    }

So to iterate what Artyom said, why would we not want to do this?!

Thanks,
Phillip Hellewell


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk