On May 8, 2013, at 23:58 , Jim Bosch <tallji...@gmail.com> wrote: > On 05/08/2013 05:48 PM, Jim Bosch wrote: >> On 05/08/2013 04:33 PM, Wichert Akkerman wrote: >>> I am trying to expose a class with a boost::uuids::uuid member to Python. >>> The class is pretty simple: >>> >>> class Article { >>> public: >>> boost::uuids::uuid uuid; >>> }; >>> >>> which is exposed like this: >>> >>> article >>> .def(init<boost::uuids::uuid, Article::Type>((arg("uuid"))) >>> .def_readwrite("uuid", &Article::uuid); >>> >>> and I have basic converter registered (see >>> https://gist.github.com/wichert/5543390 , it is a bit large to include in >>> this email). This compiles fine and the uuid convertor works correctly when >>> trying converting from python to C++, but trying to access the uuid >>> property results in "TypeError: No Python class registered for C++ class >>> boost::uuids::uuid". I don't understand why that doesn't work; does anyone >>> see what I missed? >>> >> >> I suspect that def_readwrite requires lvalue converters, and I see that >> you've only implemented an rvalue converter. I think in this case you're >> better off just writing a getter and setter, and wrapping those using >> add_property. >> > > Ah, sorry, that didn't make any sense. There's no such thing as an lvalue > to-Python converter, and to-Python is the problem here. > > You may want to try also registering your to-Python converter for the > pointers and/or references to uuid. I ran into a similar problem with > getting def_readwrite to work a while back, and specializing for > pointer/reference/const variants made it go away, though I was using a > different converter mechanism (by partial specialization of some template > classes - not something I'd recommend here).
If I try to do that by adding this: to_python_converter<boost::uuids::uuid, uuid_to_python>(); to_python_converter<boost::uuids::uuid&, uuid_to_python>() I get a compile error: /opt/local/include/boost/python/converter/as_to_python_function.hpp:21:84: error: 'type name' declared as a pointer to a reference of type 'boost::uuids::uuid &' static void convert_function_must_take_value_or_const_reference(U(*)(T), int, T* = 0) {} ^ /opt/local/include/boost/python/to_python_converter.hpp:88:10: note: in instantiation of template class 'boost::python::converter::as_to_python_function<boost::uuids::uuid &, <anonymous>::uuid_to_python>' requested here &normalized::convert ^ ../../python/uuid.cc:77:2: note: in instantiation of member function 'boost::python::to_python_converter<boost::uuids::uuid &, <anonymous>::uuid_to_python, false>::to_python_converter' requested here python::to_python_converter<boost::uuids::uuid&, uuid_to_python>(); which suggests that to_python_converter doesn't really like to see references. Wichert. _______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig