(这是我昨天问的问题,但我简化了它)

我创建了一个类,其中我想要两个对象作为函数(下面称为 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”(这实际上适用于我的类型,但我更喜欢显式输出参数)。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!