I have some virtual methods with default implementations that I am defining according the guidelines on the documentation and I ran into some unexpected behavior. If I define a virtual method in boost python like so
void receivedMsg( const sl::Message& msg ) { if( bp::override func_receivedMsg = this->get_override( "receivedMsg" ) ) func_receivedMsg( boost::cref( msg ) ); } it works fine, my receivedMsg function gets called in python no problem. Note that I am not calling the default implementation because the default implementation does not do anything, I do not want to make them pure virtual because the idea is that the user only has to define the methods he wants notifications on. My trouble comes when I do void receiverDeleted( const std::string& type, const std::string& name ) { if( bp::override func_receiverDeleted = this->get_override( "receiverDeleted" ) ) func_receiverDeleted( boost::cref( type ), boost::cref( name ) ); } I get a error_already_set exception because the mechanics under the hood cannot pythonize the boost::cref( type ). In my first example, Message is defined in python so I guess cref works like that, but the default converter for std::string must not like the boost::cref wrapper. I do not get the exception and it seems to work fine if I remove the crefs. I added the cref's a while ago because it seemed like the right thing to do. I do not want boost::python creating copies of my objects under the hood, maybe it does anyway, I do not know. Do the crefs do anything? Should I even have them? Is this a bug or just me being stupid? :p Thanks
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig