2016-01-28 3 views
1

Я получаю очень похожий вопрос, как в: unexpected result iterating over a boost::python vector_indexing_suiteTypeError когда итерация подталкивание :: питона вектор

У меня есть следующий C++ код:

#include <vector> 
#include <boost/python.hpp> 
#include <boost/python/suite/indexing/vector_indexing_suite.hpp> 

using namespace boost::python; 

class Composite { 

    public: 
     std::string name; 
     std::vector<Composite*>& getChildren() { 
     return children; 
    }; 

    std::vector<Composite*> children; 
}; 

typedef std::vector<Composite*> CompositeArray; 

BOOST_PYTHON_MODULE(coin) 
{ 
    class_<CompositeArray>("CompositeArray") 
     .def(vector_indexing_suite<CompositeArray, true>()); 


    class_<Composite>("Composite", "Composite*", init<>()) 
     .def("getChildren", &Composite::getChildren, return_internal_reference<>()) 
     .def_readwrite("name", &Composite::name, "str") 
    ; 
} 

И следующий код Python:

import coin 

gna = coin.Composite() 
gna.name = "test" 
gna2 = coin.Composite() 
gna2.name = "test2" 

gna.getChildren().append(gna2) 

for slip in gna.getChildren(): 
     print(slip.name) 

производит ошибку:

Traceback (most recent call last): 
    File "gna.py", line 34, in <module> 
    for prout in gna.getChildren(): 
TypeError: No to_python (by-value) converter found for C++ type: class Composite * __ptr64 

Это работало отлично с Boost 1.59, но не с Boost 1.60.

Любая идея?

Edit: Я попытался обновив (см предложение ниже):

class_<Composite>("Composite", "Composite*", init<>()) 

к:

class_<Composite, Composite*>("Composite", "Composite*", init<>()) 

И я подтверждаю, что он работает с усилением 1,59, но не форсировать 1,60.

+0

не работает с 1,55 либо. –

+0

Когда я пишу «class_ », я не получаю сообщение об ошибке ни с boost1.59, ни с boost1.60. Я скомпилировал boost с gcc-4.8.4 и python3.4. Возможно, что-то не так с вашей установкой или с вашей командой компиляции. Можете ли вы показать нам свою команду? – cromod

+0

Я использую Visual Studio 2013 и Python 3.3.5. Я попробую с новым Python. Вы все еще интересуетесь линией компиляции VS? – CanardMoussant

ответ

1

Изменение

class_<Composite>("Composite", "Composite*", init<>()) 

в

class_<Composite, Composite*>("Composite", "Composite*", init<>()) 

помог с повышением 1,55.

+0

Спасибо! К сожалению, он все еще не работает. – CanardMoussant

+0

Возможно, вы правы, я что-то пропустил, строя свой репродуктор. Теперь я уверен, что у меня что-то работает с повышением 1.59, а не с повышением 1.60. – CanardMoussant

 Смежные вопросы

  • Нет связанных вопросов^_^