C++ SWIG:处理派生类中的基类重载方法

C++ SWIG:处理派生类中的基类重载方法,c++,python,inheritance,swig,overloading,C++,Python,Inheritance,Swig,Overloading,我正在努力使这在游泳中变得优雅 我有一个基类,它包含一个重载的create方法: class Base { public: virtual Foo *create(ClassA &, ClassB &) = 0; Foo *create(int id) { // get ClassA a and ClassB b from an internal store related to id return create(a, b);

我正在努力使这在游泳中变得优雅

我有一个基类,它包含一个重载的create方法:

class Base {
public:
    virtual Foo *create(ClassA &, ClassB &) = 0;
    Foo *create(int id) {
        // get ClassA a and ClassB b from an internal store related to id
        return create(a, b);
    }
};
这是当然,大口大口的包装没有麻烦

在其他位置/存储库中,有几个不同的基类派生类,它们当然定义了它们自己的纯虚拟创建(ClassA&,ClassB&)方法版本,但它们不需要定义创建(int)变量,因为基类版本应该足够了

这些派生类的SWIG包装只看到在派生类中定义的create()方法,不提供带有单个int参数的变量,即使它们应该从基类继承它

我已经尝试使用%rename作为基类的方法来获得一些有用的东西,例如

%rename (_create1) Base::create(ClassA&,ClassB&);
%rename (_create2) Base::create(int);

%extend (Base) {
    %pythoncode {
        def create(self, a_or_id, b=None):
            if b is not None:
                self._create1(a_or_id, b):
            else:
                self._create2(a_or_id)
    }
}
这在生成的python/_wrap.cc代码中似乎很好,但是派生类的包装器将只包装create()方法,就好像没有%rename一样

它们是分开的.I文件,但是派生类..i文件都导入基本文件。我文件,所以Python类继承是正确的,只是C++类继承,被这个被覆盖的方法稍微打败了。 理想情况下,我希望有一个解决方案,不必在所有派生类.I文件中插入%rename语句(尽管我知道这可以解决问题),这意味着大量重复的代码


有什么想法吗?

您确定类声明正确吗?派生类中相同命名的虚拟方法隐藏基类方法,除非
使用
将基函数引入派生命名空间。例如:

class A
{
    public:
        void func(int a);
        virtual void func(int a,int b);
};

class  B : public A
{
    public:
        //using A::func;
        virtual void func(int a,int b);
};
使用SWIG和Python,我无法编写:

b = B()
b.func(1)    # failed
b.func(1,2)

不使用“<代码> >行>不注释”,并且C++中的类也没有正确工作。使用<<代码>使用< /C> >,SHIG正确地将函数暴露给Python和C++。./P>在C++中工作良好(而且仍然如此),但是我只是通过重载重载方法来解决我的SHIG问题。我想我知道/为什么/我有这个问题,只是似乎没有真正优雅的解决方案,哦,好吧。SWIG在它能处理的方面有点限制,我理解为什么会这样。实际上,我道歉,你也对C++的东西是正确的。直到现在才注意到-子类的一个实例在没有using行的情况下无法看到重载的方法。很高兴提供帮助!如果答案是有用的,请考虑投票,并通过投票工具标记答案正确,并检查答案的左边。