Всем привет! Код можно было бы еще сократить, но я уже побоялся, может как раз суть и обрежу. Итак, такая проблема, есть С++ код, и мои "сочинения" для boost::python:
| Код | //------ Third-party, как есть => не меняем class HelpClass { bool HelpClass::Foo( int & Param) {... ; return true} // результат выполнения функции записывается в Param bool HelpClass::Foo( double & Param) {... ; return true} } class Base { { Base(); Base( const Base& ){}; virtual ~Base();
HelpClass MyVar; ...};
//------ Мое, меняем :) class WrapBase : Base, wrapper<Base> {...} //там у меня override виртуальных функций
class DerivedHelp : HelpClass { // там много оверлоадингов, в том числе и std::string, но я для краткости 2 покажу int MyFoo(const int & Param) {return Base::Foo(const_cast<int&>(Param)) ? Param : 0 ;} // теперь функция возвращает результат, вот такой вот я "хитрый", может есть поизящней способ? double MyFoo(const double & Param) {return Base::Foo(const_cast<double&>(Param)) ? Param : 0 ;} };
class WrapHelp : DerivedHelp, wrapper<DerivedHelp> {} //пусто,без него компилятор ругается
//overloading int (WrapHelp::*MyFoo1)(const int &) = &WrapHelp::MyFoo; int (WrapHelp::*MyFoo2)(const double &) = &WrapHelp::MyFoo;
BOOST_PYTHON_MODULE( pyApp) { class_<WrapBase, boost::noncopyable>("Base", init<>()) // для совместимости вызов из питона назвал также как и в С++ .... .def_readonly("MyVar", &WrapBase::MyVar) ; class_<WrapHelp, boost::noncopyable>("WrapHelp", init<>()) .def("Foo", MyFoo1) .def("Foo", MyFoo2) ;
|
Вот... Все компилируется через bjam без проблем (по крайней мере с этим кодом). Запускаю и питон:
| Код | >>> from pyApp import * >>> py = Base() #вы же помните, что это на самом деле WrapBase ;) >>> py.MyVar <pyApp.WrapConfigReader object at 0xb74e66bc> # как я понимаю объект создан >>> py.MyVar.Foo(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> Boost.Python.ArgumentError: Python argument types in WrapHelp.Foo(WrapHelp, int) did not match C++ signature: Foo(WrapHelp {lvalue}, int) Foo(WrapHelp {lvalue}, double)
|
2 дня сижу с этой проблемой... сил уже нет. Единственное, что нагуглил, это: pyApp.WrapHelp.__init__ , ну в общем, проиницилизировать мой объект, но он же уже создан вроде как <pyApp.WrapConfigReader object at 0xb74e66bc>
Но это во-первых не работает , а во-вторых мне нужно сделать правильную инициализацию на С++ стороне, поэтому и написал это в этом форуме.
Подскажите, люди добрые, век благодарен буду Если че-то не дописал, подскажите, разъясню поконкретней
P.S. Вот что заметил: <pyApp.WrapConfigReader object at 0xb74e66bc> разве не должно быть что-то вроде pyApp.Base. WrapConfigReader ? Хотя в том же классе есть другой похожий объект, который работает без вопросов... |