Hello, Classes with protected destructors (as found when custom reference counting is used) seem to cause some trouble when using bp::wrapper<> containing a method that takes a const reference to a refcounted class.
Say I have: #include <cstdio> #include <boost/python.hpp> namespace bp = boost::python; class Thing { protected: virtual ~Thing() {} }; class Callback { public: Callback() { } virtual void execute(const Thing& t) { } protected: virtual ~Callback() {} }; And I want to add a wrapper class so that Callback can be derived from in Python and its execute() method overridden. Simply writing struct CallbackWrap : Callback, bp::wrapper<Callback> { void execute(const Thing& t) { if (bp::override ovr = this->get_override("execute")) { fprintf(stderr, "have override, calling...\n"); ovr(t); fprintf(stderr, "done calling\n"); } else Callback::execute(t); } void default_execute(const Thing& t) { fprintf(stderr, "default\n"); this->Callback::execute(t); } }; BOOST_PYTHON_MODULE(doh) { bp::class_<Thing, boost::noncopyable>("Thing") ; bp::class_<CallbackWrap, boost::noncopyable>("Callback") .def("execute", &Callback::execute, &CallbackWrap::default_execute) ; } doesn't cut it as I get a compile error due to Thing::~Thing() being protected. I've found in the archive the trick you can use to wrap a normal method taking a const reference, e.g. void Callback_execute(Callback& self, Thing& t) { // Work around the const Thing& parameter self.execute(t); } bp::class_<Callback>("Callback") .dep("execute", &Callback_execute) ; But I don't see how I can use that in the case of the wrapper class. I tried adding functions that do the equivalent thing but for method Callback::execute() and CallbackWrap::default_execute() but that doesn't compile. And I can't find in the documentation of class_<>::def() the exact requirements for the special case of .def() that is used when the extra default implementation is specified. Is there a way to get wrapper classes to work in this situation? Thanks, Paul _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig