SWIG:包装std :: map <key,val =“”* =“”>时出现编译器错误

时间:2018-02-02 09:36:07

标签: c++ swig

我发现this old issue我对地图有类似的问题,其中值是指针,而不是键。我得到这个编译器错误:

error: no member named 'type_name' in 'swig::traits<C>'

当我编写自己的typemap或者使用SWIG“std_map.i”类型地图时,都会发生这种情况。我需要采取哪些额外步骤来为指向类型提供type_name?

最小的工作示例:

%module stdmap;

%include "std_map.i"

%{
    class C
    {
        public:
             C() {};
    };
%}

class C
{
    public:
        C();
};

%template(mymap) std::map<int, C*>;

1 个答案:

答案 0 :(得分:1)

SWIG可能对类指针感到困惑,因为它的包装器无论如何都使用指针。无论如何,SWIG文档说(大胆的):

  

本节中的库模块提供对标准C ++库(包括STL)部分的访问。 SWIG对STL的支持是一项持​​续的努力。对于某些语言模块,支持非常全面,但是一些较少使用的模块没有编写相当多的库代码。

如果您可以自由更改实现,我会看到两个可行的解决方法。我使用Python作为测试的目标语言:

  1. 使用std::map<int,C>
  2. %module stdmap
    
    %include "std_map.i"
    
    %inline %{
    
    #include <memory>
    
    class C
    {
    public:
        C() {};
    };
    
    %}
    
    %template(mymap) std::map<int, C>;
    

    输出(注意c是C *的代理对象):

    >>> import stdmap
    >>> c = stdmap.C()
    >>> m = stdmap.mymap()
    >>> m[1] = c
    >>> c
    <stdmap.C; proxy of <Swig Object of type 'C *' at 0x00000263B8DA5780> >
    
    1. 使用std::map<int, std::shared_ptr<C>>
    2. %module stdmap
      
      %include "std_map.i"
      %include "std_shared_ptr.i"
      %shared_ptr(C)
      
      %inline %{
      
      #include <memory>
      
      class C
      {
      public:
          C() {};
      };
      
      %}
      
      %template(mymap) std::map<int, std::shared_ptr<C> >;
      

      输出(c现在是一个shared_ptr代理):

      >>> import stdmap
      >>> c = stdmap.C()
      >>> m = stdmap.mymap()
      >>> m[1] = c
      >>> c
      <stdmap.C; proxy of <Swig Object of type 'std::shared_ptr< C > *' at 0x00000209C44D5060> >