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

Posted

技术标签:

【中文标题】swig shared_ptr 导致一个不透明的对象【英文标题】:swig shared_ptr results in an opaque object 【发布时间】:2017-03-10 22:06:51 【问题描述】:

我正在尝试将 C++ 库 SWIG 到 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();

痛饮:

//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】:

我认为您在这里的顺序有点错误。请注意,在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 >;

【讨论】:

非常感谢。这确实是问题所在。内联 cmets 也是正确的。

以上是关于swig shared_ptr 导致一个不透明的对象的主要内容,如果未能解决你的问题,请参考以下文章

带有模板类的 SWIG SHARED_PTR 宏

SWIG:如何从 SwigPyobject 获取包装的 std::shared_ptr 的值

关于shared_ptr

为啥包含枚举的 C++ 方法会导致 SWIG/C# 中的 AccessViolationExceptions?

为啥不推荐使用 std::shared_ptr::unique() ?

SWIG 在 Windows 中生成 C++ Python3 包装器导致断言 MSVC 2017