[C++-sig] boost.python fails to recognize type
Roman Yakovenko
roman.yakovenko at gmail.com
Sun Jul 27 20:33:07 CEST 2008
On Sun, Jul 27, 2008 at 4:01 AM, Mateusz Berezecki <mateuszb at gmail.com> wrote:
> Hi list readers,
>
> I want to enable Python to access the C++ class.
> I do this as follows:
>
> BOOST_PYTHON_MODULE(ht)
> {
> <...>
> class_<Hypertable::ScanSpec>("ScanSpec")
> .def_readwrite("row_limit", &Hypertable::ScanSpec::row_limit)
> .def_readwrite("max_versions", &Hypertable::ScanSpec::max_versions)
> .def_readwrite("columns", &Hypertable::ScanSpec::columns)
> .def_readwrite("start_row", &Hypertable::ScanSpec::start_row)
> .def_readwrite("start_row_inclusive",
> &Hypertable::ScanSpec::start_row_inclusive)
> .def_readwrite("end_row", &Hypertable::ScanSpec::end_row)
> .def_readwrite("end_row_inclusive",
> &Hypertable::ScanSpec::end_row_inclusive)
> ;
> <...>
> }
>
> The ScanSpec class is defined as follows:
> 00087 class ScanSpec {
> 00088 public:
> 00089 ScanSpec();
> 00090 size_t encoded_length();
> 00091 void encode(uint8_t **bufPtr);
> 00092 bool decode(uint8_t **bufPtr, size_t *remainingPtr);
> 00093 uint32_t row_limit;
> 00094 uint32_t max_versions;
> 00095 std::vector<const char *> columns;
> 00096 const char *start_row;
> 00097 bool start_row_inclusive;
> 00098 const char *end_row;
> 00099 bool end_row_inclusive;
> 00100 std::pair<uint64_t,uint64_t> interval;
> 00101 bool return_deletes;
> 00102 };
>
> The conversion process happens in the Table class wrapper which is
> defined as follows
> class Table {
> private:
> Hypertable::TablePtr m_table_ptr;
>
> public:
> Table() {}
> Table(Hypertable::TablePtr ptr) : m_table_ptr(ptr) {}
>
> TableScanner create_scanner(object pyspec)
> {
> Hypertable::ScanSpec& spec = extract<Hypertable::ScanSpec&>(pyspec);
> return TableScanner(m_table_ptr->create_scanner(spec, 10));
> }
> };
>
> The error is as follows
> TypeError: No registered converter was able to extract a C++ reference
> to type Hypertable::ScanSpec from this Python object of type
> Boost.Python.class
>
> I've also tried extracting it as a pointer
> TypeError: No registered converter was able to extract a C++ pointer
> to type Hypertable::ScanSpec from this Python object of type
> Boost.Python.class
>
> And the same happens when trying to extract a copy of ScanSpec, but
> this time the error message tells it's not possible to extract rvalue
> from Boost.Python.class.
>
> I've tried every possible combination and it doesn't work.
>
> Can somebody please help me ?
The first step is to create small and complete example, that shows your problem.
--
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/
More information about the Cplusplus-sig
mailing list