Как правильно экспортировать SWIG typedef из объявления класса?

Я использую 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 линия:

(Ошибка «Не найдено подходящего преобразования».)

1

Решение

Оказывается, что 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>>;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]