无法在 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;
};
%}
我正在使用 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;
};
%}