[C++-sig] smart pointer and polymorphism problem
Christophe Pradal
christophe.pradal at cirad.fr
Thu Nov 27 10:52:23 CET 2003
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?
--
Christophe PRADAL
More information about the Cplusplus-sig
mailing list