Я пытаюсь выставить класс (Child) с 2 членами (val и parent), используя boost.python.Оба являются общедоступными, а родительский тип имеет тип Child.Компиляция не дает ошибок, но моя оболочка python выдает следующее, когда я пытаюсь получить доступ к parent:
TypeError: No to_python (by-value) converter found for C++ type: class
Я довольно новичок в C ++, python и, следовательно, boost.python.Я, вероятно, упускаю что-то довольно очевидное, но я не совсем понимаю, что здесь не так.
Я использую Visual Studio Community 2017 и python2.7 (оба 64-битных) в Windows 7.
Здесьразличные части кода:
Child.h
class Child {
public:
Child();
double val;
Child* parent;
};
Child.cpp
#include "Child.h"
Child::Child()
{
val = 0.0;
}
Wrapper.cpp
#include <boost/python.hpp>
#include "Child.h"
BOOST_PYTHON_MODULE(WrapPyCpp)
{
boost::python::class_<Child>("Child")
.def_readwrite("val", &Child::val)
.def_readwrite("parent", &Child::parent)
;
}
Обертка.py
import WrapPyCpp
class_test = WrapPyCpp.Child()
class_test.val = 1.0
class_test_parent = WrapPyCpp.Child()
class_test.parent = class_test_parent
print class_test_parent.val
print dir(class_test)
print class_test.val
print class_test.parent.val
И когда я запускаю Wrapper.py, последняя строка выдает исключение:
C:\Users\Visual Studio 2017\Projects\MinExBoostPython2\x64\Debug>Wrapper.py
0.0
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__instance_size__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'parent', 'val']
1.0
Traceback (most recent call last):
File "C:\Users\Visual Studio 2017\Projects\MinExBoostPython2\x64\Debug\
Wrapper.py", line 12, in <module>
print class_test.parent.val
TypeError: No to_python (by-value) converter found for C++ type: class Child * __ptr64
C:\Users\Visual Studio 2017\Projects\MinExBoostPython2\x64\Debug>
Я ожидаю доступа к родительскому элементу и его члену val.Насколько я понимаю ошибку, я предполагаю, что есть проблема с тем, как я выставляю parent, который объявлен как указатель.Я прав?
Я использовал .def_readwrite("parent", &Child::parent)
, потому что он является общедоступным членом Child, но я не уверен, что это правильный способ доступа к нему.
Я попытался найти информацию в документации boost.python и взглянул на
TypeError: преобразователь to_python (по значению) не найден для типа C ++
и
Вызов Boost.Python по ссылке: TypeError: Не найден конвертер to_python (по значению) для типа C ++:
, но если решение длямоя проблема там, я не понял ее.
В любом случае, я был бы очень признателен, если бы кто-нибудь мог помочь мне исправить мою ошибку и объяснить, почему я ошибаюсь!
Спасибо!