2017-09-13 32 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>>;