swig shared_ptr导致一个不透明的对象

时间:2017-03-10 22:06:51

标签: python c++ swig shared-ptr

我正在尝试将C ++库转换为Python。其中一个C ++函数返回一个shared_ptr。我成功地生成了一个Python模块,但该函数返回给Python的对象似乎没有成员。这是SWIG处理shared_ptr的限制还是我做错了什么?

这大致是我的代码结构:

//foo.h
namespace MyNamespace
{
    class Base {};
    template <typename T> class Derived : public Base {};
    std::shared_ptr<Base> make_obj();
}

SWIG:

//foo.i
%module foo
%include <std_shared_ptr.i>

%{
    #define SWIG_FILE_WITH_INIT
    #include "foo.h"
%}

%include "foo.h"
%template(FooA) MyNamespace::Derived< MyNamespace::AAA >;
%template(FooB) MyNamespace::Derived< MyNamespace::BBB >;
%shared_ptr(MyNamespace::Base)
%shared_ptr(FooA)
%shared_ptr(FooB)

1 个答案:

答案 0 :(得分:1)

我认为你这里的事情有点错误。请注意,在shared_ptr文档中的所有示例中,在完全看到该类型的任何声明/定义之前,它们会调用%shared_ptr

关于%shared_ptr指令以及更正的FooA / FooB模板实例的注释,我相信这样的事情应该适用于你的例子。

//foo.i
%module foo
%include <std_shared_ptr.i>

%{
    #define SWIG_FILE_WITH_INIT
    #include "foo.h"
%}


%shared_ptr(MyNamespace::Base)
%shared_ptr(FooA) // This should probably be MyNamespace::Derived<...>
%shared_ptr(FooB) // This should probably be the fully qualified C++ type also

%include "foo.h"

%template(FooA) MyNamespace::Derived< MyNamespace::AAA >;
%template(FooB) MyNamespace::Derived< MyNamespace::BBB >;