我正在使用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 inheritance和using
keyword(虽然没有关于私有继承的例子)应该得到支持,所以我在这里缺少什么? / p>
答案 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;
};
%}