У меня есть класс C ++ с чисто виртуальной функцией, которую я обертываю следующим образом, используя Boost Python:
class Model {
virtual double Test() = 0;
};
class ModelWrapper : public Model, public boost::python::wrapper<Model> {
double Test() {
return this->get_override("Test")();
}
};
BOOST_PYTHON_MODULE(mymodule)
{
class_<ModelWrapper, boost::noncopyable>("Model")
.def("Test, pure_virtual(&Model::Test))
;
}
У меня также есть функция c ++, которая ожидает объект Model в качестве аргумента:
double MyFunction(Model& m) {
return m.Test()
}
Теперь я хотел бы сделать производный класс в Python, который переопределяет функцию Model :: Test, но все еще может быть передан MyFunction. Что-то вроде этого:
from mymodule import *
class NewModel(Model):
def Test(self):
return 0.5
m = NewModel()
print(MyFunction(m))
который я хотел бы распечатать 0,5 в этом случае. Вместо этого я получаю эту ошибку:
> ArgumentError: Python argument types in
> mymodule.MyFunction(NewModel) did not match C++ signature:
> MyFunction(Model {lvalue})
Я не уверен, какой шаг мне не хватает, чтобы NewModel можно было использовать там, где ожидается Model. Любое понимание будет с благодарностью.
Мне нужно было явно добавить «Model .__ init __ (self)» в функцию NewModel __init__. После этого все заработало нормально.