
Stefan Popov wrote:
I ran onto a problem when using intrusive_ptr, overloading and MS visual studio 8
All my classes derive a reference counted class RefCnt. For example:
class GLTexture : public RefCnt {...}; class GLRenderBuffer : public RefCnt {...};
I define smart pointers using the intrusive_ptr class:
typedef boost::intrusive_ptr<GLTexture> GLTexturePtr; typedef boost::intrusive_ptr<GLRenderBuffer> GLRenderBufferPtr;
Than I define a function accepting both GLTexturePtr and GLRenderBufferPtr :
void attachTarget(GLTexturePtr aTexture); void attachTarget(GLRenderBufferPtr aBuffer);
invoking <code>attach(new GLTexture)</code> leads to an error: ambiguous function call.
The reason is in the contructor of intrusive_ptr: template<class U> intrusive_ptr(intrusive_ptr<U> const & rhs) ... which allows an invocation with an unrelated pointer.
This program: #include <boost/intrusive_ptr.hpp> class RefCnt { }; void intrusive_ptr_add_ref( RefCnt * ); void intrusive_ptr_release( RefCnt * ); class GLTexture: public RefCnt { }; class GLRenderBuffer: public RefCnt { }; typedef boost::intrusive_ptr<GLTexture> GLTexturePtr; typedef boost::intrusive_ptr<GLRenderBuffer> GLRenderBufferPtr; void attachTarget(GLTexturePtr aTexture); void attachTarget(GLRenderBufferPtr aBuffer); int main() { attachTarget( new GLTexture ); } compiles for me under MSVC 8.