SWIG C++/Python:继承代理对象 我在C++文件中有类似的东西,组成我的SWIG模块: class CObject { public: void do() { // some treatments } }; class Interface { public: void add(CObject* obj) { obj->do(); } };
在使用我的SWIG模块的python代码中,有如下内容:SWIG C++/Python:继承代理对象 我在C++文件中有类似的东西,组成我的SWIG模块: class CObject { public: void do() { // some treatments } }; class Interface { public: void add(CObject* obj) { obj->do(); } };,python,c++,inheritance,swig,ownership,Python,C++,Inheritance,Swig,Ownership,在使用我的SWIG模块的python代码中,有如下内容: from mySwigModule import Interface, CObject class MyObj(CObject): def __init__(self): super(CObject, self).__init__() inter = Interface() inter.add(MyObj()) // ERROR 这段代码非常基本。真正的是处理更大的物体。 但问题是:在运行Python代码时
from mySwigModule import Interface, CObject
class MyObj(CObject):
def __init__(self):
super(CObject, self).__init__()
inter = Interface()
inter.add(MyObj()) // ERROR
这段代码非常基本。真正的是处理更大的物体。
但问题是:在运行Python代码时,会打印类似的内容:
NotImplementedError: Wrong number or type of arguments for overloaded function 'Interface_add'.
Possible C/C++ prototypes are:
Interface::add(CObject *)
我如何向SWIG解释如何在CObject中转换对象
当然,这与类型映射有关,但我不知道具体是什么。
我尝试将此添加到接口文件中,但未成功:
%typemap(in) CObject * {
if ((SWIG_ConvertPtr($input, (void **) &$1, $1_descriptor)) == -1) {
$1 = (CObject *) $1;
}
}
编译时返回的错误类似于:
error: macro "SWIG_ConvertPtr" requires 4 arguments, but only 3 given
In function ‘PyObject* _wrap_Interface_add__SWIG_0(PyObject*, PyObject*)’:
error: ‘SWIG_ConvertPtr’ was not declared in this scope
在实际代码中,使用两个参数调用Interface::add()。也许类型映射需要指定其他参数的类型
debian、python 3.2、SWIG 2
编辑:显示真正的错误。您的
\uuuu init\uuuu
有错误。试试这个:
def __init__(self):
super(MyObj, self).__init__()
甚至这个:
def __init__(self):
super().__init__()
完整测试:
/*示例.i*/
%模块示例
%内联%{
类CObject{public:void do_it(){};
类接口{public:voidadd(CObject*obj){obj->do_it();};
%}
#test.py
从示例导入接口,CObject
MyObj类(CObject):
定义初始化(self):超级(MyObj,self)
接口().add(MyObj())
构建和测试程序
$swig-o example_wrap.cc-python-c++example.i
$g++-o示例_wrap.os-c-fPIC-I/usr/include/python3.4示例_wrap.cc
$g++-o_example.so-共享示例_wrap.os
$python3 test.py
$
我过去在Python删除我的SWIG对象时遇到过一些问题。您可以尝试:
my_obj=MyObj()
然后调用inter.add(my_obj)
。测试后,即使我在使用mySwigModule
的类的class属性中存储my_obj
,也不会改变任何内容。但是,当我将它存储在全局var中时,C++代码拒绝对象,因为它不是COBUTION类型:<代码> NoTimPrimeNeDeRoRor:重载函数“接口FAdEdAdd”<代码>的错误数字或类型类型,它可能是一个键入,但是在您的.h:<代码>空洞添加(COBOSUT*OBJ)< /代码>中,这条线似乎是错误的。现在正确了:)你找到解决问题的办法了吗?太可怕了;非常感谢你!完全成功。再次感谢!