boost :: python参数类型与

时间:2015-04-28 21:09:56

标签: python c++ boost

我使用包装器导出一个类:

#include <boost/python.hpp>

namespace {

namespace bp = boost::python;

class A {
public:
    A(){}
    virtual ~A(){}

};

struct A_Wrap:
    A, bp::wrapper<A>{

    //ctr
    A_Wrap():A(){}
    //dtr
    ~A_Wrap(){}

    //func
    void foo(){
        PySys_WriteStdout("test in");
    }
};

A* make_A(){
    return new A();
}

BOOST_PYTHON_MODULE(A){

    bp::class_<A_Wrap, boost::noncopyable>("A_Wrap", bp::init<>())
        .def("foo", &A_Wrap::foo)
        ;

    bp::def("make_A", &make_A, bp::return_value_policy<bp::manage_new_object>());
}

}

在python中:

import A
a = A.make_A()
a.foo()

导致错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
    A_Wrap.foo(A_Wrap)
did not match C++ signature:
    foo((anonymous namespace)::A_Wrap {lvalue})

我想知道为什么不匹配?

我知道这可能看起来无法使用,但同样的问题出现在一个对我来说非常有用的类似方法上。这是我重现问题的最简化方式。

感谢。

1 个答案:

答案 0 :(得分:0)

您有效地尝试:

void foo(A_Wrap* ) { }

A* a = new A;
foo(a); // invalid conversion from A* to A_Wrap*

这也不适用于C ++。您可能希望make_A实际返回A_Wrap

A* make_A() {
    return new A_Wrap();
}

这使您的代码适合我:

>>> import A
>>> a = A.make_A()
>>> a.foo()
test in>>> 
>>>