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.


_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig

Reply via email to