SWIG:std / multimap.i对于Tcl包装似乎已损坏

时间:2019-05-07 21:24:29

标签: c++ tcl swig readonly multimap

我正在尝试包装一个暴露单个Multimap数据成员的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;
    };
    }

很显然,上述类的C ++ API在它们中具有更多的复杂性,但是在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代码以获取可用于读取多图内容的迭代器?

1 个答案:

答案 0 :(得分:0)

我发现以下link提供了不完善的解决方法。从某种意义上说它并不完善,因为它不能提供所有多地图功能的完整包装,并且界面很尴尬:迭代器只能作为容器本身的扩展方法进行操作。当然,不提供写访问权限,但出于我的目的,此限制是可以的。我仍然在寻找更好的答案。