[C++-sig] Problem with map_indexing_suite

John Reid j.reid at mail.cryst.bbk.ac.uk
Mon Jul 12 09:52:10 CEST 2010



Damien Dupuis wrote:
> I'm trying to wrap a whole C++ that contains a lot of access to std::vector and std::map.
> 
> I managed to wrap vectors but i've got problems with maps.
> 
> The following simple example fails to compile with the error:
> error: no match for call to ‘(const boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<X*>) (X*)‘
> 
> ====================================================
> #include <boost/python.hpp>
> #include <boost/python/suite/indexing/vector_indexing_suite.hpp>
> #include <boost/python/suite/indexing/map_indexing_suite.hpp>
> using namespace boost::python;
> 
> class X {
>     public:
>     X(std::string s): _s(s) {}
>     std::string const repr() { return _s; }
> 
>     private:
>     std::string _s;
> };
> 
> class Y {
>     public:
>     Y(): _vec(), _map() {};
>     void addToVec(X* x)                { _vec.push_back(x); }
>     void addToMap(int i, X* x)         { _map[i] = x;       }
>     const std::vector<X*>& getXVec()   { return _vec;       }
>     const std::map<int, X*>& getXMap() { return _map; }
> 
>     private:
>     std::vector<X*>   _vec;
>     std::map<int, X*> _map;
> };
> 
> BOOST_PYTHON_MODULE(pyTEST) {
>     class_<X, X*>("X", init<std::string>())
>         .def("__repr__", &X::repr)
>     ;
> 
>     class_<std::vector<X*> >("XVec")
>         .def(vector_indexing_suite<std::vector<X*>, true>())
>     ;
> 
>     class_<std::map<int, X*> >("XMap")
>         .def(map_indexing_suite<std::map<int, X*>, true>())
>     ;
> 
>     class_<Y>("Y", init<>())
>         .def("addToVec", &Y::addToVec)
>         .def("addToMap", &Y::addToMap)
>         .def("getXVec" , &Y::getXVec , return_internal_reference<>())
>         .def("getXMap" , &Y::getXMap , return_internal_reference<>())
>     ;
> }
> ====================================================
> 
> 
> I tried to use boost::shared_ptr<X> instead of X* in this small example and it works, but I would like not to have to correct all my existing C++ code to use boost::shared_ptr.
> And since it works well with std::vector<X*>, I think it should work with maps.
> 
> Some google search make me think I should add a return_value_policy to the __getitem__ method of std::map<int, X*> class, but when I try I get the error
> error: address of overloaded function with no contextual type information
> I'm clearly doing something wrong here.

That sounds like the right idea. Are you taking the address of an 
overloaded function? In which case the compiler might not know which 
overload to use.




More information about the Cplusplus-sig mailing list