我使用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;)
答案 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>>;