如何从类声明中正确导出SWIG typedef?

时间:2017-09-13 09:16:40

标签: c++ ocaml swig

我使用SWIG,在头文件evidence.h中,我有以下内容:

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

在swig接口文件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行相对应:

  

(失败&#34;未找到适当的转换。&#34;)

1 个答案:

答案 0 :(得分:2)

事实证明,对于输出接口模块和C / ++代码,typedef和rename以及模板各自为SWIG做了不同的事情,让事情正常工作并不是C的一对一映射。 swig接口的/ ++代码。因此,尽管实际标题中的Observation类型是typedef&#39; d,但有效的方法是使用%template swig宏/语言/术语。

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

因此,&#34;未找到适当的转换。&#34;错误实际上是动态类型寻找相同的类型,但最终名称使用一些不同的SWIG术语。如果您选择模板观察,然后使用除了之前模板化的任何其他内容,它不会映射。因此,您必须小心swig接口文件。

这有效:

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