首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIG:包装std::map<key、val *>时的编译器错误

SWIG:包装std::map<key、val *>时的编译器错误
EN

Stack Overflow用户
提问于 2018-02-02 09:36:06
回答 1查看 333关注 0票数 0

我发现,对于值是指针而不是键的映射,这个老问题和我有类似的问题。我得到了这个编译器错误:

代码语言:javascript
复制
error: no member named 'type_name' in 'swig::traits<C>'

无论是在我自己编写类型地图时还是在我使用"std_map.i“类型地图时,都会发生这种情况。我需要采取哪些额外步骤来为指向类型提供一个type_name?

最小工作实例:

代码语言:javascript
复制
%module stdmap;

%include "std_map.i"

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

class C
{
    public:
        C();
};

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

回答 1

Stack Overflow用户

发布于 2018-02-04 20:20:14

SWIG可能对类指针感到困惑,因为它的包装器无论如何都使用指针。在任何情况下,SWIG文档都说(粗体地雷):

本节中的库模块提供了对标准C++库(包括STL )部分的访问。对STL的SWIG支持是正在进行的一项工作。对某些语言模块的支持是相当全面的,但一些较少使用的模块没有编写那么多库代码。

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

  1. 使用std::map<int,C>

代码语言:javascript
复制
%module stdmap

%include "std_map.i"

%inline %{

#include <memory>

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

%}

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

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

代码语言:javascript
复制
>>> 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>>

代码语言:javascript
复制
%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代理):

代码语言:javascript
复制
>>> 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> >
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48579695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档