SWIG C++/Python:继承代理对象 我在C++文件中有类似的东西,组成我的SWIG模块: class CObject { public: void do() { // some treatments } }; class Interface { public: void add(CObject* obj) { obj->do(); } };

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代码时

在使用我的SWIG模块的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)< /代码>中,这条线似乎是错误的。现在正确了:)你找到解决问题的办法了吗?太可怕了;非常感谢你!完全成功。再次感谢!