Обвих успешно клас с име Composite. Този клас има следния метод:
std::vector<Composite*> Composite::getChildren();
Опитах се да обвия върнатия std::vector с помощта на vector_indexing_suite по този начин: [фрагмент]
typedef std::vector<Composite*> CompositeArray;
BOOST_PYTHON_MODULE(composite)
{
class_<CompositeArray>("CompositeArray")
.def(vector_indexing_suite<CompositeArray, true>());
class_<Composite>("Composite", init<>())
... more wrapper
.def("getChildren", &Composite::getChildren)
... more wrapper
;
}
Сега всичко изглежда работи правилно и когато извикам метода getChildren() от python, той връща правилно опакован CompositeArray. Мога да направя например:
from composite import Composite
myComp = Composite()
myComp.addChild('childA')
myComp.addChild('childB')
len(myComp.getChildren()) #returns 2
myComp.getChildren()[0] # returns the first child of type Composite
Но когато се опитам да повторя CompositeArray, като по този начин:
for child in myComp.getChildren():
# do something with child...
Получих това съобщение за грешка:
TypeError: No to_python (by-value) converter found for C++ type: class Composite * __ptr64
което за мен няма смисъл, като се има предвид, че достъпът по индекс работи перфектно! Заседнал съм в това... имате ли представа какво правя погрешно?
Благодаря ти.
class Composite * __ptr64
изглежда, че итераторът връща чист указател иboost::python
се опитва да го копира като обвит обект на Python. Предполагам, че не сте предоставили нещо катоclass_<Composite*>()
. Можете ли да покажете тип връщане наComposite::iterator::operator*()
? - person elmo   schedule 02.07.2012CompositeArray
и наследява отstd::vector
. В този случай върнатата стойност наCompositeArray::iterator::operator*()
ще бъде указател. Доста съм изненадан, че се компилира, защото ако се опитате да дефинирате функцияComposite * some_function()
с.def("some_function", &some_function)
, това ще ви даде грешка, че трябва да предоставите правила за връщане. Мисля, че в горния код трябва да направим същото. - person elmo   schedule 02.07.2012get_item
като първи опит. - person elmo   schedule 02.07.2012for x in X
всъщност използва лиget_item
в този случай. Въпреки че все още съм объркан защо това работи за индекси... - person elmo   schedule 02.07.2012