[C++-sig] Re: smart pointer and polymorphism problem

Christophe Pradal christophe.pradal at cirad.fr
Thu Nov 27 11:33:48 CET 2003


Thank you very much.

All is OK.


Raoul Gough a écrit:

>Christophe Pradal <christophe.pradal at cirad.fr> writes:
>
>  
>
>>I use an intrusive refcount pointer as described by Scott Meyers in
>>"More effective C++" and improved by adding template casting operator
>>(Scott Meyers again, but later).
>>Considering RefCountObject as the base class for pointed objects and
>>RefCountPtr the smart pointer template, I built a small example
>>reproducing the error:
>>
>>class O: public virtual RefCountObject
>>{
>>public:
>>  O(): RefCountObject() {}
>>  virtual ~O() {}
>>  virtual int get() = 0;
>>};
>>
>>class A: public O
>>{
>>public:
>>  int _a;
>>  A(): O(), _a(1) {}
>>  virtual ~A( ) {}
>> int get() {return _a;}
>>};
>>
>>typedef RCPtr<O> OPtr;
>>typedef RCPtr<A> APtr;
>>
>>int foo(const OPtr& p) { return p->get(); }
>>
>>BOOST_PYTHON_MODULE(test)
>>{
>>  class_< O, OPtr, boost::noncopyable >("O", no_init);
>>  class_< A, APtr, bases<O>,boost::noncopyable >("A", init<>());
>>  def( "foo",foo );
>>};
>>
>>In python, the following test fail:
>>
>> >>> import test
>> >>> a= test.A()
>> >>> test.foo(a)
>>Traceback (most recent call last):
>>  File "<stdin>", line 1, in ?
>>Boost.Python.ArgumentError: Python argument types in
>>    test.foo(A)
>>did not match C++ signature:
>>    foo(class TOOLS::RefCountPtr<class O>)
>>
>>
>>Any idea?
>>    
>>
>
>When there is an implicit conversion between types (other than derived
>to base conversions, I mean), you can register it with something like:
>
>boost::python::implicitly_convertible<A, O>();
>
>Of course, in this case you already have this conversion since you
>registered O as a base class of A. I notice that foo takes a smart
>pointer rather than a reference to O, so maybe you would need this:
>
>boost::python::implicitly_convertible<RefCountPtr<A>, RefCountPtr<O> >();
>
>On the other hand, I'm not sure if that will work because Ptr<A> and
>Ptr<O> are only held types and not the actual class_<> types. It's
>worth a go I suppose, but you wouldn't have any problem if foo took an
>O &.
>
>  
>





More information about the Cplusplus-sig mailing list