(这是我昨天问的问题,但我简化了它)
我创建了一个类,其中我想要两个对象作为函数(下面称为 Test)的输出参数。但是,当我运行 swig 命令 swig -c++ -python swigtest.i 时,出现错误“警告 453:无法应用(MyClass 和输出)。未定义类型映射。”我尝试添加类型映射,但这无济于事。我也尝试过使用指针、指向指针的指针和指向指针的引用,这也无济于事。
我觉得我忽略了一些简单的事情,因为这应该是一件很常见的事情。或者我是否需要编写一个复杂的类型映射,就像我已经看到但(还)不理解的那样?
下面是我的代码:
MyClass.h(已简化以使其易于理解,因此仅切换到 int 没有帮助):
class MyClass
{
int x;
public:
int get() const
{
return x;
}
};
void Test(MyClass &obj1, MyClass &obj2);
swigtest.i:
%module swigtest
%include typemaps.i
%{
#define SWIG_FILE_WITH_INIT
%}
%{
#include "MyClass.h"
%}
%include "MyClass.h"
%apply (MyClass& OUTPUT) { MyClass &obj1 }
%apply (MyClass& OUTPUT) { MyClass &obj2 }
请您参考如下方法:
如我之前的评论所述,%apply OUTPUT 技巧仅适用于一组有限的 POD 类型。
对于 future 的 Swiggers,此解决方案对我有用(在 C# 绑定(bind)中):
%typemap(cstype) CustomType* "out CustomType"
%typemap(csin,
pre=" $csclassname temp$csinput = new $csclassname();",
post=" $csinput = temp$csinput;"
) CustomType* "$csclassname.getCPtr(temp$csinput)"
这会为通过指针传递的 CustomType 生成一个带有“out”参数的公共(public)接口(interface)。内部 P/Invoke 接口(interface) (csim) 保留为原始指针。 “csin”类型映射创建一个临时变量并分配给输出参数。
另外值得注意的是,在 C# 中,如果 MyCustomType 已经是一个引用类型,您可能不需要这个,但是有一个 API 可以修改参数值而不将其声明为“out”(这实际上适用于我的类型,但我更喜欢显式输出参数)。