我使用包装器导出一个类:
#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})
我想知道为什么不匹配?
我知道这可能看起来无法使用,但同样的问题出现在一个对我来说非常有用的类似方法上。这是我重现问题的最简化方式。
感谢。
答案 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>>>
>>>