用SWIG包装共享指针对象不能访问类成员函数

Tot*_*son 5 c++ python swig shared-ptr

我有一个C ++ CameraManager类,它管理Camera对象的列表。相机对象由std :: list作为共享指针管理,即每个列表项的类型为:shared_ptr <Camera>。

我可以从CameraManager对象获取Camera作为

 std::shared_ptr<Camera> c = cameraManager.getCamera();
Run Code Online (Sandbox Code Playgroud)

使用Swig创建Python模块,以上内容翻译为python代码:

  camera = cameraManager.getCamera()
Run Code Online (Sandbox Code Playgroud)

但是,上面的camera Python对象不允许我访问任何Camera类函数。Python说的是一种类型的对象:####处的'std :: shared_ptr *类型的Swig对象

在Swig接口文件中添加以下内容

%include <std_shared_ptr.i>
%shared_ptr(Camera)
Run Code Online (Sandbox Code Playgroud)

包括之前

%include "aiCamera.h"
Run Code Online (Sandbox Code Playgroud)

不要在生成的Python模块中更改行为。有什么想法可能会丢失吗?

附加信息:C ++代码使用typedef:

typedef CameraSP std::shared_ptr<Camera>;
Run Code Online (Sandbox Code Playgroud)

Camera类是从基类派生的,该基类实际上是空的。

class MVR_API MVRObject
{
public:
                                     MVRObject();
                                     MVRObject(const MVRObject& obj);
    virtual                         ~MVRObject();

};
Run Code Online (Sandbox Code Playgroud)

该代码使用VS 2013和CMake进行编译。CMake代码如下所示:

set_source_files_properties(${PyModule}.i PROPERTIES CPLUSPLUS ON)
set_source_files_properties(${PyModule}.i PROPERTIES SWIG_FLAGS "-threads")

SWIG_ADD_LIBRARY(${PyModule}
    TYPE MODULE 
    LANGUAGE python 
    SOURCES ${PyModule}.i
    )


SWIG_LINK_LIBRARIES (${PyModule}
    ${PYTHON_LIB_FOLDER}/Python37.lib    
    dslFoundation
    aimvr
)

# INSTALL PYTHON BINDINGS
# Get the python site packages directory by invoking python
execute_process(COMMAND python -c "import site; print(site.getsitepackages()[0])" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
message("PYTHON_SITE_PACKAGES = ${PYTHON_SITE_PACKAGES}")

SET(SWIG_RUNTIME ${CMAKE_CURRENT_BINARY_DIR}/mvr_swigpyrun.h)
execute_process(COMMAND ${SWIG_EXECUTABLE} -python -external-runtime ${SWIG_RUNTIME})

Run Code Online (Sandbox Code Playgroud)

更新:问题不是Swig和共享指针的使用。这是一个第三方库,具有自己的shared_ptr实现。通过名称空间名称解析共享指针解决了该问题,并且生成的Python模块按预期开始工作。

Tot*_*son 2

上面的问题是处理 Allied Vision 的 C/C++ API,控制他们的相机。他们定义了自己的共享指针类,并使用与std共享指针类相同的名称来命名它,即shared_ptr。

此 API 的客户端代码使用 std::shared_ptr,并且在某些时候使用共享_ptr,而不指定命名空间会导致 Swig 出现上述问题。通过在使用shared_ptr时显式指定std命名空间,问题得到了解决,并且使用共享指针生成的swigged对象开始完美工作。