[C++-sig] operator+(A, B) without B::B() default constructor in boost.python

Hans Roessler hansroessler at yahoo.de
Sat May 16 11:48:36 CEST 2009


Thank you for suggesting the workaround. But I would like to understand _why_ the operator overloading doesn't work the Boost.Python way in my example (or what I have done wrong).
It can be quite tedious to write a wrapper like __add__ for each operator and pair of classes, and I thought the ".def(self <op> other)" syntax was implemented for exactly this purpose?

Hans



----- Ursprüngliche Mail ----
> Von: Sebastian Walter <walter at mathematik.hu-berlin.de>
> An: Development of Python/C++ integration <cplusplus-sig at python.org>
> Gesendet: Freitag, den 15. Mai 2009, 11:02:23 Uhr
> Betreff: Re: [C++-sig] operator+(A, B) without B::B() default constructor in boost.python
> 
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Hans Roessler schrieb:
> 
> Hello Hans,
> 
> in my experience .def(self+other) often didn't quite do what I expected.
> You could try something like that:
> 
> int int__add__A_B(const A &lhs, const B &rhs){
>      return operator+(A,B);
> }
> 
> .def("__add__", &int__add__A_B)
> 
> 
> i.e. first define a non-overloaded function int_add__A_B and then bind it to 
> __add__ (which is the Python operator+ function).
> 
> regards,
> Sebastian
> 
> 
> > Hello,
> > how can I wrap the following overloaded operator+ using boost.python?
> > The code as is fails with 
> >> ...
> >> pytest.cpp: In function ‘void init_module_pytest()’:
> >> pytest.cpp:19: error: expected primary-expression before ‘(’ token
> >> ...
> > If I try ".def(self+B())" instead of ".def(self+other())", the error is
> >> ...
> >> pytest.cpp: In function ‘void init_module_pytest()’:
> >> pytest.cpp:17: error: no matching function for call to ‘B::B()’
> >> ...
> > 
> > best wishes
> > Hans
> > 
> > 
> > pytest.cpp:
> > 
> > #include 
> > using namespace boost::python;
> > 
> > class A{
> > public:
> > };
> > class B{
> > public:
> >   B(int i){};
> > };
> > 
> > int operator+(const A& a,const B& b){return 42;};
> > 
> > BOOST_PYTHON_MODULE(pytest)
> > {
> >   class_("A")
> >     .def(self+other())   //.def(self+B())            //line 17
> >     ;
> >   class_("B",init)    //line 19
> >     ;
> > }
> > 
> > 
> >      
> > _______________________________________________
> > Cplusplus-sig mailing list
> > Cplusplus-sig at python.org
> > http://mail.python.org/mailman/listinfo/cplusplus-sig
> 
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v2.0.4-svn0 (GNU/Linux)
> Comment: Using GnuPG with SUSE - http://enigmail.mozdev.org
> 
> iD8DBQFKDS+f9PBA5IG0h0ARAnfLAJ9rGkoAUY9c2FUgJTIcWx+AFN1akACdHg7s
> MAVRLstiqwAtaf9RmDsLXko=
> =b8b/
> -----END PGP SIGNATURE-----
> _______________________________________________
> Cplusplus-sig mailing list
> Cplusplus-sig at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig



      


More information about the Cplusplus-sig mailing list