/ / nieoczekiwany wynik iterujący po boost :: python vector_indexing_suite - c ++, python, boost-python, stdvector

nieoczekiwany wynik iterujący po boost :: python vector_indexing_suite - c ++, python, boost-python, stdvector

Zapakowałem pomyślnie klasę Composite. Ta klasa ma następującą metodę:

std::vector<Composite*> Composite::getChildren();

Próbowałem zawinąć zwracany std :: vector używając vector_indexing_suite, w ten sposób: [skrawek]

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
;
}

Teraz wszystko wydaje się działać poprawnie i kiedy wywołuję metodę getChildren () z Pythona, zwraca poprawnie owinięty obiekt CompositeArray. Mogę zrobić, na przykład:

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

Ale kiedy próbuję iterować nad CompositeArray, jak w ten sposób:

for child in myComp.getChildren():
# do something with child...

Dostałem ten komunikat o błędzie:

TypeError: No to_python (by-value) converter found for C++ type: class Composite * __ptr64

co nie ma dla mnie sensu, biorąc pod uwagę, że dostęp przez indeks działał idealnie! Utknąłem na tym ... Czy masz pojęcie o tym, co robię źle?

Dziękuję Ci.

Odpowiedzi:

2 dla odpowiedzi № 1

Próbować

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

Zamiast

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