在 python 中,我使用 Base 的派生 class,它是 SWIG 包装的 Base class,但失败并显示错误信息:'Base *' 类型的参数 2

in python, I use derived class of Base which is a Base class wrappered by SWIG, but failed with error info: argument 2 of type 'Base *'

// a.h
class A 
{
public:
void register(Base*);
}

// a.cpp
void A::register(Base* pBase)
{
    pBase->run();
}

// Base.h
class Base
{
public:
virtual void run()=0;
}

然后,我使用 SWIG 3.0 用 module.i

包装这个 Class A 的函数寄存器
// module.i
%module(directors=1) myModule

%{
#include "a.h"
#include "Base.h"
#include <boost/shared_ptr.hpp>
%}

%include  <boost_shared_ptr.i>
%shared_ptr(Base)

%include "a.h"
%feature("director") BaseCase;  // force no abstract for BaseCase
%include "Base.h"

然后,我在 python 中使用 Base 的派生 class,但失败并显示错误信息:'Base *'

类型的参数 2
# deriveClass.py
class deriveClass(myModule.Base):
    def __init__(self):
        myModule.Base.__init__(self)
    def run(self):
        print('derived class')

测试脚本如下:

test.py

import myModule
import deriveClass
a=myModule.A()
a.register(deriveClass.deriveClass()) # error found here.

嗯,参考维基之后(http://www.swig.org/Doc1.3/Typemaps.html) 我修好了它。 我举个例子如下:

// a.cpp
#include "a.h"

void A::re(Base* pBase)
{
    // pBase->run();
    baseList.push_back(pBase);
}

void A::notifyrun()
{
    vector<Base*>::iterator iter = baseList.begin();
    for (; iter != baseList.end();iter++)
    {
        (*iter)->run();
    } 
}

// a.h
#include <iostream>
#include <vector>

using namespace std;

class Base
{
public:
virtual void run()=0;
};


class A 
{
public:
    void re(Base* pBase);
    void notifyrun();
private:
    vector<Base*> baseList;
};

// module.i
%module(directors=1) myModule

%{
#include "a.h"
#include <iostream>
#include <boost/shared_ptr.hpp>
%}

%include "std_string.i"
%include "std_map.i"

%include  <boost_shared_ptr.i>
%shared_ptr(Base)

%feature("director") Base;  // force no abstract for BaseCase
%include "a.h"

// test script 
import sys
sys.path.append(".")
import myModule


class deriveClass(myModule.Base):
    def __init__(self):
        myModule.Base.__init__(self)
    def run(self):
        print('derived class')

deriveClass = deriveClass()
deriveClass.run()

a = myModule.A()
a.re(deriveClass)
a.notifyrun()

首先,使用命令a.o编译a.o:

g++ -fPIC -o a.o -c a.cpp

其次,使用swig生成包装文件。

swig -c++ -python module.i

最后,建一个_myModule.so

g++ -fPIC -Wall -Wextra -shared a.o -o _myModule.so module_wrap.cxx -I/usr/include/python2.7 -lpython2.7

现在,您可以运行 python

中的脚本
python deriveClass.py
derived class
derived class