请解释一下这些警告是什么,以及如何避免?
Warning 503: Can't wrap 'operator ()' unless renamed to a valid identifier.
Warning 503: Can't wrap 'operator =' unless renamed to a valid identifier.
Warning 503: Can't wrap 'operator *' unless renamed to a valid identifier.
这些警告是在Android NDK下编译SWIG生成的C++代码时生成的。
发布于 2012-04-24 19:33:59
Java没有与C++相同意义上的operator()
或operator=
等价物,因此SWIG无法直接包装它。因为它们可能很重要,所以会向您显示一个警告,说明它们没有被包装。(缺少operator=
有时可能特别糟糕)。
此代码在运行swig -Wall -c++ -java
时显示这样的警告
%module Sample
struct test {
bool operator()();
};
但是,您可以使警告静默,并告诉SWIG直接将操作符公开为常规成员函数,如下所示:
%module Sample
%rename(something_else) operator();
struct test {
bool operator()();
};
这会导致在生成的包装器中添加一个名为something_else
的函数来代替operator()
。
或者你可以断言SWIG忽略这些是很好的,使用:
%ignore operator()
(您也可以通过使用类名限定运算符来不太广泛地应用这些指令)。
发布于 2012-04-24 19:28:49
如果你想在目标语言中使用重载运算符,你需要在SWIG中以一种特殊的方式处理它们。参见here。
发布于 2019-10-18 20:51:27
如果在用于实例化函数的%template
指令之前出现%rename
指令,则可能会遇到此警告:
%module some_module
%rename("%(undercase)s", %$isfunction) "";
// equivalently %rename("%(utitle)s", %$isfunction) "";
%inline %{
template<class T>
void MyFunction(){}
%}
// ...
%template(MyIntFunction) MyFunction<int>;
警告503:除非重命名为有效的标识符,否则无法包装'my_function< int >‘
并且您不能尝试在%template
中预期重命名
%template(MyIntFunction) my_function<int>;
因为那样你就会得到
错误:模板'myfunction‘未定义。
如果你正在应用全局重命名规则,这是非常令人沮丧的,而且你真的只需要为几件事“忽略重命名”。与类型映射不同,重命名指令永远有效。如果能够关闭它们,那就太好了,即使是暂时的。
我想出的唯一解决办法是返回到%rename
,并将其更新为仅显式地匹配(或者更确切地说,不匹配)您声明的内联模板函数。如下所示:
// don't rename functions starting with "MyFunction"
%rename("%(undercase)s", %$isfunction, notregexmatch$name="^MyFunction") "";
它不是完美的,但它是一种变通方法。
(这一切都是在SWIG 4.0中完成的)
https://stackoverflow.com/questions/10296932
复制相似问题