Я использую 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
линия:
(Ошибка «Не найдено подходящего преобразования».)
Оказывается, что typedef, rename и template делают разные вещи для SWIG в отношении модулей интерфейса вывода и кода C / ++, и заставить работать все не совсем однозначно, сопоставляя код C / ++ с интерфейс Swig. Таким образом, несмотря на то, что тип Observation в реальном заголовке является typedef’d, сработало использование макроса swig% template / language / term.
В любом случае проблема заключается в том, что в коде C каждый шаблон или тип соответствует перечислению или объявлению, которое используется для своего рода отображения массива. Этот массив используется для упрощения интерфейса однородного типа, делая тип числом, которое переносится с экземпляром, а затем используется в поиске.
Следовательно, «Не найдено подходящего преобразования». Ошибка на самом деле была динамическая типизация, которая искала идентичный тип, но с каким-то другим жаргоном SWIG для окончательного имени. Если вы выберете шаблон Observation, но затем будете использовать что-то другое, кроме того, что вы предварительно шаблонировали, оно не отображается. Итак, вы должны быть осторожны с файлами интерфейса Swig.
Это сработало:
%template(Observation) std::map<Var, size_t>;
%template(VecObservation) std::vector<std::map<Var, size_t>>;
Других решений пока нет …