我发现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*>;
答案 0 :(得分:1)
SWIG可能对类指针感到困惑,因为它的包装器无论如何都使用指针。无论如何,SWIG文档说(大胆的):
本节中的库模块提供对标准C ++库(包括STL)部分的访问。 SWIG对STL的支持是一项持续的努力。对于某些语言模块,支持非常全面,但是一些较少使用的模块没有编写相当多的库代码。
如果您可以自由更改实现,我会看到两个可行的解决方法。我使用Python作为测试的目标语言:
std::map<int,C>
:
%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> >
std::map<int, std::shared_ptr<C>>
:
%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> >