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

Cannot expose private base class member functions in SWIG wrapper

我正在使用 SWIG 为 Android 应用程序包装一些 C++ 代码。当我使用从另一个私有继承的 class 并在其中抛出几个 using 指令以公开 parent 的一些成员函数时,我遇到了一个问题。看起来像这样:

#include "Bar.h"

class Foo : private Bar {

//Stuff Foo-specific...

public:
    using Bar::baz;
};

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

Foo.h:8: Warning 315: Nothing known about 'Bar::baz()'.

注意:两个 header 都包含在包装文件中,只有 Foo header 被包装,因为我不想要 Bar header 被包装,我的 .i 文件看起来像:

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

%include "Foo.h"

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

我在 SWIG 文档中读到应该支持 private inheritance and the using keyword(尽管没有关于私有继承的示例),所以我在这里遗漏了什么?

首先,您的 using 语句应该是 using Bar::baz;

无论如何,正如 SWIG 在警告中所说,如果它不知道 Bar::baz() 中的声明,它就无法包装 Foo::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;
};
%}