Я пытаюсь обернуть класс ContainerMap, который предоставляет один элемент данных для нескольких карт:
namespace MYCLASSES {
class ContainedAttributes {
std::string _value;
};
class NameList {
public:
std::vector<std::string> _names;
};
typedef std::multimap<NameList, ContainedAttributes> ContainerMap;
class Container {
public:
ContainerMap _contents;
};
}
Очевидно, что API C ++ для указанных классов более сложен, но на уровне Tcl мне просто нужно перебрать элементы _contents и взглянуть на содержимое ContainedAttributes.
Я написал SWIG-код, который выглядит следующим образом:
%module myclasswrapper
%nodefaultctor; // Disable creation of default constructors
%nodefaultdtor; // Disable creation of default constructors
%include <stl.i>
%include <std_string.i>
%include <std_vector.i>
%include <std/std_multimap.i>
%{
#include "my_classes.h"
#include <vector>
#include <string>
#include <map>
%}
namespace MYCLASSES {
using namespace std;
class NameList {
vector<string> _names;
};
class Container {
};
class ContainedAttributes {
};
}
using namespace MYCLASSES;
using namespace std;
%template(ContainerMap) multimap<NameList, ContainedAttributes >;
%template(StringVector) vector<string>
namespace MYCLASSES {
%extend Container {
MYCLASSES::ContainerMap & get_contents {
return self->_contents;
}
}
<more code here>
}
%clearnodefaultctor; // Enable the creation of default constructors again
%clearnodefaultdtor; // Enable the creation of default constructors again
Очевидно, есть дополнительный код для переноса других классов.
Независимо от того, какую версию SWIG я использую, я всегда получаю одну и ту же ошибку:
> swig -c++ -tcl8 -ltclsh.i example.i
.../share/swig/4.0.0/std/std_multimap.i:89: Error: Syntax error in input(3).
Я провел много испытаний, включая комментирование некоторых оскорбительных строк в файле std_multimap.i, но я не могу заставить его даже правильно скомпилироваться. Даже после комментирования строк, составляющих swig barf (строки 89 и 98), я все еще не могу скомпилировать сгенерированный код-обертку, поскольку swig, похоже, хочет сгенерировать обертки-конструкторы для класса контейнера с одним строковым векторным аргументом.
Правильно ли я пришел к выводу, что на самом деле нет поддержки мультикартовых контейнеров для цели Tcl, или я просто совершаю какую-то глупую ошибку?
Если мой вывод верен, как бы вы посоветовали написать код Swig, чтобы получить итераторы, которые я могу использовать для чтения содержимого мультикарты?