2017-09-13 30 views
1

我使用痛饮,并在头文件evidence.h,我有以下几点:如何从类声明中正确导出SWIG typedef?

namespace dai { 
    class Evidence { 
     public: 
      typedef std::map<Var, size_t> Observation; 
    }; 
} 

而且在痛饮接口文件dai.i,我有以下几点:

//The types are defined in both swig and the output cxx file... 
%include "../include/dai/evidence.h" 
%include "../include/dai/var.h" 
#include "../include/dai/evidence.h" 


//namespace std { 
%{ 
    typedef std::map<Var, size_t> Observation; 
%} 
// %template(Observation) map<Var, size_t>; 
//} 
typedef std::map<Var, size_t> Observation; 
%template(VecObservation) std::vector<dai::Evidence::Observation>; 

我相信, Var使得它正确地生成cxx文件和ml文件,所以我不会进入该部分。正是我遇到的问题,即向我声明的VecObservation模板添加项目。在test.ml文件,我有以下几点:

let observation = new_Observation C_void in 
let observations = new_VecObservation C_void in 
let _ = (invoke observations) "push_back" observation in() 

而且我得到对应于push_back行错误:(“没有找到适当的转换”失败)

回答

2

事实证明,typedef和rename和template分别为SWIG做了关于输出接口模块和C/++代码的不同事情,并且让事情工作并不完全是一对一的从C/++代码到swig界面。因此,尽管实际标题中的观察类型是typedef'd,但使用%模板swig宏/语言/项的工作是有效的。

在任何情况下,问题是在C代码中,每个模板或类型都对应于用于数组映射的枚举或声明。这个数组用于通过使类型成为一个与实例一起携带的数字来促进同类型的接口,然后用于查找。

因此,“找不到适当的转换”。错误实际上是动态类型寻找一个相同的类型,但与最终名称一些不同的SWIG术语。如果您选择模板观察,但使用其他任何模板(除了之前模板化的模板),它不会映射。所以,你必须小心你的swig接口文件。

这工作:

%template(Observation) std::map<Var, size_t>; 
%template(VecObservation) std::vector<std::map<Var, size_t>>;