Объект собственного типа в классе - TypeError: для типа C ++ не найден конвертер to_python (по значению) - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь выставить класс (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 ++:

, но если решение длямоя проблема там, я не понял ее.

В любом случае, я был бы очень признателен, если бы кто-нибудь мог помочь мне исправить мою ошибку и объяснить, почему я ошибаюсь!

Спасибо!

1 Ответ

0 голосов
/ 02 апреля 2019

Редактировать

Я понял, что, заменив строку

boost::python::class_<Child>("Child")

на

boost::python::class_<Child, Child*>("Child")

inWrapper.cpp решил мою проблему.Результат, как и ожидалось, будет:

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
0.0

C:\Users\Visual Studio 2017\Projects\MinExBoostPython2\x64\Debug>

Надеюсь, это кому-нибудь поможет!

...