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

标签 c++ ocaml swig

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

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

在 swig 接口(interface)文件 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 行相对应的错误:

(Failure "No appropriate conversion found.")

最佳答案

事实证明,typedef、rename 和 template 在输出接口(interface)模块和 C/++ 代码方面都为 SWIG 做了不同的事情,并且让事情正常工作并不完全是从 C/+ 的一对一映射+ swig 界面的代码。因此,尽管实际 header 中的观察类型是 typedef,但起作用的是使用 %template swig 宏/语言/术语。

无论如何,问题是在 C 代码中,每个模板或类型都对应一个枚举或声明,用于数组的一种映射。该数组用于通过使类型成为实例携带的数字来促进同质类型接口(interface),然后在查找中使用。

因此,“未找到合适的转换。”错误实际上是动态类型寻找相同的类型,但使用一些不同的 SWIG 术语作为最终名称。如果您选择对 Observation 进行模板化,但随后使用除了您之前模板化的内容之外的任何其他内容,它不会映射。因此,您必须小心处理 swig 接口(interface)文件。

这有效:

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

关于c++ - 如何从类声明中正确导出 SWIG typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46193513/

相关文章:

ocaml - 更改 utop 输出宽度

algorithm - 二叉搜索树中序遍历的无环函数算法

c++ - 使用 SWIG 用虚拟方法包装 C++ 类并在 python 中覆盖它们

c++ - 无法使用 QOpenGLWidget 读取 GL_DEPTH_COMPONENT

c++ - 为嵌套类模板重载运算符<<

c++ - 在 c++0x 之前的版本中使用 map::at()

ocaml - 使用模块无限循环 OCaml 类型检查器如何工作?

python - SWIG 和 Python : Create a package compatible with any 3. x 版本

python - 在 CentOS 7 上构建 Tensorflow 时出错

c++ - 输入数值时代码卡住循环