[C++-sig] Re: operator[]

chuzo okuda okuda1 at llnl.gov
Wed May 22 18:41:04 CEST 2002


I am not sure how to fix the following compiler problem...

------------------------------------------------
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
using namespace boost::python;

class Vector2d {
public:
   Vector2d():x(0.0),y(0.0) {}
   Vector2d(const double xval, const double yval): x(xval),y(yval) {}
   ~Vector2d() {}
   double& operator[](const int i) {return i==0 ? x : y;}

protected:
   double x, y;
};

BOOST_PYTHON_MODULE_INIT(simpleVector2)
{
   module Vect2dMod("simpleVector2");
   Vect2dMod
      .add(
           class_<Vector2d>("Vector2d")
           .def_init()
           .def_init(args<const double, const double>())
           //.def("__getitem__", &Vector2d::operator[])
           .def("__getitem__", (double& (Vector2d::*)(const int))
&Vector2d::operator[])
           )
      ;
}
-------------------------------------------------

Problem:
If I replace the class definition of operator[] in 
double& operator[](int i) const {return i==0 ? x : y;}
by either 
.def("__getitem__", &Vector2d::operator[])
or
.def("__getitem__", (double (Vector2d::*)(const int) const)
&Vector2d::operator[])
it compiled, but the above code issued error message:

"/usr/dnta/kull/developers/thirdPartySoftware/boost-chuzo/boost/boost/python/preprocessed/returning_non_void.hpp",
line 35: error:
          class
         
"boost::python::detail::specify_a_result_policy_to_wrap_functions_ret
          urning<double &>" has no member "convertible"
      if(!cr.convertible())return 0;

AND

"/usr/dnta/kull/developers/thirdPartySoftware/boost-chuzo/boost/boost/python/preprocessed/returning_non_void.hpp",
line 37: error:
          expression must have (pointer-to-) function type
      PyObject*result=cr(((

???
Does anyone have any idea how to fix this? 
Thank you
Chuzo





David Abrahams wrote:
> 
> __getitem__ can be used directly, but the signature for __setitem__ is:
> 
>     __setitem__(self, key, value):
> 
> so you need a wrapper function:
> 
>     template <class Self, class Key, class Value>
>     setitem(Self& self, Key const& key, Value const& value)
>     {
>         self[key] = value;
>     }
> 
>     ...
> 
>     .def("__setitem__", &setitem<Vector2d,int,double>)
> 
> ----- Original Message -----
> From: "chuzo okuda" <okuda1 at llnl.gov>
> To: "David Abrahams" <david.abrahams at rcn.com>
> Cc: "Martin Casado" <casado2 at llnl.gov>; "Susan Hazlett"
> <shazlett at llnl.gov>; "Kathleen McCandless" <mccandless2 at llnl.gov>
> Sent: Wednesday, April 24, 2002 7:38 PM
> Subject: operator[]
> 
> > Dave,
> > Now, I have problem with operator[].
> >
> > class Vector2d {
> > public:
> >    Vector2d():x(0.0),y(0.0) {}
> >    Vector2d(const double xval, const double yval): x(xval),y(yval) {}
> >    ~Vector2d() {}
> >    double getX() {return x;}
> >    double getY() {return y;}
> >    double& operator[](int i) {return i==0 ? x : y;}
> >
> > protected:
> >    double x, y;
> > };
> >
> > int main(int argc, char** argv) {
> >    Vector2d v = Vector2d(1.0,2.0);
> >    cout << v[0] << "; " << v[1] << endl;
> >    v[0] = 5.0; v[1] = 9.0;
> >    cout << v[0] << "; " << v[1] << endl;
> > }
> >
> > And operator[] in C++ support both read and write operation.
> > It is not clear how to write "__setitem__" and "__getitem__" like:
> >
> > .def("__setitem__", &Vector2d::operator[])
> > .def("__getitem__", &Vector2d::operator[])
> 
> _______________________________________________
> C++-sig mailing list
> C++-sig at python.org
> http://mail.python.org/mailman/listinfo/c++-sig





More information about the Cplusplus-sig mailing list