【问题标题】:swig shared_ptr results in an opaque objectswig shared_ptr 导致一个不透明的对象
【发布时间】: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)

【问题讨论】:

    标签: python c++ swig shared-ptr


    【解决方案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 也是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2023-01-24
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多