2017-09-13 4 views
1

나는 꿀꺽 꿀꺽를 사용하고, 그리고 헤더 파일 evidence.h에, 나는 다음이클래스 선언 내에서 SWIG typedef를 올바르게 내보내려면 어떻게해야합니까? 나는 다음과 같은 한</p> <pre><code>namespace dai { class Evidence { public: typedef std::map<Var, size_t> Observation; }; } </code></pre> <p>그리고 꿀꺽 꿀꺽 인터페이스 파일 <code>dai.i</code>에 :

//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 템플릿에 항목을 추가하는 것과 관련된 문제가 있습니다.

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

그리고 나는 push_back 라인에 해당하는 오류가 점점 오전 :하십시오 test.ml 파일에서, 나는 다음과 같은 있습니다 (". 찾을 수 없습니다 적절한 변환"실패)

답변

2

출력 인터페이스 모듈과 C/++ 코드와 관련하여 typedef와 이름 바꾸기 및 템플리트가 각각 다른 작업을 수행하며 작동하는 것은 정확히 C/++ 코드를 swig 인터페이스에 추가하십시오. 따라서 실제 헤더의 Observation 유형이 typedef 인 사실에도 불구하고 % template swig 매크로/언어/용어를 사용하는 것이 효과적이었습니다.

어떤 경우 든 문제는 C 코드에서 모든 템플릿 또는 형식이 배열의 매핑 종류에 사용되는 enum 또는 선언에 해당한다는 것입니다. 이 배열은 유형을 인스턴스와 함께 가지고 다니면서 조회에 사용하는 형식으로 만들어 동종 유형 인터페이스를 용이하게하는 데 사용됩니다.

따라서 "적절한 변환이 없습니다." 오류는 실제로 동일한 유형을 찾는 동적 유형 지정 이었지만 궁극적 인 이름에 대해 다른 여러 가지 특수 용어를 사용했습니다. 관측 템플릿을 선택했지만 이전에 템플리트 한 것과 다른 것을 사용하면 맵핑되지 않습니다. 그래서, 당신은 당신의 swig 인터페이스 파일을 조심해야합니다.

이 일 :

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