Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Boost::Python несоответствие типов аргумента


Автор: vig220 14.1.2013, 05:04
Всем привет!
Код можно было бы еще сократить, но я уже побоялся, может как раз суть и обрежу.
Итак, такая проблема, есть С++ код, и мои "сочинения" для 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>

Но это во-первых не работает smile, а во-вторых мне нужно сделать правильную инициализацию на С++ стороне, поэтому и написал это в этом форуме.

Подскажите, люди добрые, век благодарен буду smile Если че-то не дописал, подскажите, разъясню поконкретней

P.S. Вот что заметил: <pyApp.WrapConfigReader object at 0xb74e66bc>  разве не должно быть что-то вроде pyApp.Base. WrapConfigReader ?  Хотя в том же классе есть другой похожий объект, который работает без вопросов...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)