Я успешно обернул класс с именем 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