无法在SWIG包装器中公开私有基类成员函数

时间:2016-06-27 12:55:42

标签: java c++ inheritance swig private-members

我正在使用SWIG为Android应用程序包装一些C ++代码。当我使用私有继承自另一个的类时,我会遇到一个问题,并在那里抛出一些using指令来暴露一些父成员函数。看起来像这样:

#include "Bar.h"

class Foo : private Bar {

//Stuff Foo-specific...

public:
    using Bar::baz;
};

问题是,当我运行SWIG时,我在包装过程中收到以下消息:

  

Foo.h:8:警告315:没有人知道' Bar :: baz()'。

注意:两个标头都包含在包装器文件中,只包含Foo标头,因为我不希望包裹Bar标头,我的.i文件看起来像:

%{
    #include "Bar.h"
    #include "Foo.h"
%}

%include "Foo.h"

然后,我的Java类没有编译,因为它找不到这个符号......

我在SWIG文档中读到了private inheritanceusing keyword(虽然没有关于私有继承的例子)应该得到支持,所以我在这里缺少什么? / p>

1 个答案:

答案 0 :(得分:1)

首先,您的using声明应为using Bar::baz;

无论如何,正如SWIG在警告中所说,如果它不知道Foo::baz()中的声明,它就无法包裹Bar::baz()

因此,您需要向SWIG显示声明,例如,通过%include "Bar.h"指令。如果您不希望包裹Bar,则可以使用其他%ignore Bar;指令。

这是一个最小的工作示例:

%ignore Bar;
%inline %{
class Bar {
public:
  double baz() { return 4.2; }
};
class Foo : private Bar {
public:
  using Bar::baz;
};
%}