/ / boost :: python vector_indexing_suiteを反復する予期しない結果 - c ++、python、boost-python、stdvector

boost :: python vector_indexing_suiteを反復する予期しない結果 - c ++、python、boost-python、stdvector

私は、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
;
}

これですべてが正しく動作しているように見え、pythonからgetChildren()メソッドを呼び出すと、ラップされた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

インデックスによるアクセスが完全に機能していると考えても、私には意味がありません! 私はこれに固執しています...あなたは私が間違っていることを知っていますか?

ありがとうございました。

回答:

回答№1は2

試す

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

の代わりに

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