[C++-sig] NoProxy and the data in an std::map

Noah Schwartz noah.schwartz1 at gmail.com
Thu Oct 19 21:08:50 CEST 2006


On Thursday 19 October 2006 15:00, Roman Yakovenko wrote:
> On 10/19/06, Noah Schwartz <noah.schwartz1 at gmail.com> wrote:
> > Hi,
> >
> >         I am having another issue with the indexing suite. I have an
> > std::map from int to boost::shared_ptr<MyClass>. However, in python, I
> > can't seem to look at the data element of an iterator into that map. I
> > get a TypeError complaining that there is no class registered for C++
> > class
> > boost::shared_ptr<MyClass>. However, I did tell python about shared_ptrs
> > of MyClass and no_proxy is set to true.
> >
> > Binding code:
> > #include <boost/python.hpp>
> > #include <boost/python/suite/indexing/map_indexing_suite.hpp>
> > #include <boost/python/register_ptr_to_python.hpp>
> > using namespace boost::python;
> >
> > #include <map>
> >
> > class MyClass {
> > public:
> >         int e;
> > };
> >
> > class MyClassMaker {
> > public:
> >         std::map<int, boost::shared_ptr<MyClass> > & func() {return
> > myMap;}; void add(int x, int y) {boost::shared_ptr<MyClass> instance(new
> > MyClass); instance->e = y; myMap[x] = instance;};
> >
> >         std::map<int, boost::shared_ptr<MyClass> > myMap;
> > };
> >
> > BOOST_PYTHON_MODULE(testlib)
> > {
> >         class_<MyClass, boost::shared_ptr<MyClass> >("MyClass")
> >                 ;
> >         class_<MyClassMaker>("MyClassMaker")
> >                 .def("func", &MyClassMaker::func,
> > return_value_policy<copy_non_const_reference>())
> >                 .def("add", &MyClassMaker::add)
> >                 ;
> >
> >         class_<std::map<int, boost::shared_ptr<MyClass> >
> > >("MapIntMyClass") .def(map_indexing_suite<std::map<int,
> > boost::shared_ptr<MyClass> >, true>()) ;
> > }
> >
> > Python code:
> > >>> import testlib
> > >>>
> > >>> a = testlib.MyClassMaker()
> > >>>
> > >>> a.add(1, 2)
> > >>> a.add(3, 4)
> > >>> a.add(5, 6)
> > >>>
> > >>> map = a.func()
> > >>>
> > >>> for i in map:
> >
> > ...     print i.key()
> > ...     print i.data()
> > ...
> > 1
> > Traceback (most recent call last):
> >   File "<stdin>", line 3, in ?
> > TypeError: No Python class registered for C++ class
> > boost::shared_ptr<MyClass>
> >
> > If you look at the binding code I have specified shared_ptr as a held
> > type.
> >
> > I should mention that if I use a simpler container such as a vector
> > container of shared_ptr's and do not specify no_proxy to true then I get
> > the same error. Maybe the no_proxy code isnt being properly applied to
> > the second template type in the map container.
>
> Google is your friend:
>
> http://mail.python.org/pipermail/c++-sig/2005-November/009849.html
> http://mail.python.org/pipermail/c++-sig/2005-November/009854.html

I did see this before sending the e-mail. That thread is almost a year old and 
the original sender was using boost 1.33.0. Are you telling me the fix made 
last year is still in CVS and isn't part of 1.33.1?


Noah



More information about the Cplusplus-sig mailing list