c – SWIG,提升共享指针和继承

前端之家收集整理的这篇文章主要介绍了c – SWIG,提升共享指针和继承前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我遇到了SWIG,共享指针和继承问题.

我正在使用创建各种继承的c类
提升共享指针以引用它们,然后将这些共享包装起来
使用SWIG创建python类的指针.

我的问题如下:

> B是A的子类
> sA是指向A的共享指针
> sB是指向B的共享指针
> f(sA)是一个期望共享指向A的函数
>如果我将sB传递给f(),则会引发错误.
>此错误仅发生在python级别.
>在C级别,我可以毫无问题地将sB传递给f().

我有提升1.40和swig 1.3.40.

以下是将重现问题的5个文件内容
有:

  1. python setup.py build_ext --inplace
  2. python test.py

swig_shared_ptr.h

  1. #ifndef INCLUDED_SWIG_SHARED_PTR_H
  2. #define INCLUDED_SWIG_SHARED_PTR_H
  3.  
  4. #include <boost/shared_ptr.hpp>
  5.  
  6. class Base {};
  7.  
  8. class Derived : public Base {};
  9.  
  10. typedef boost::shared_ptr<Base> base_sptr;
  11. typedef boost::shared_ptr<Derived> derived_sptr;
  12.  
  13. void do_something (base_sptr bs);
  14.  
  15. base_sptr make_base();
  16. derived_sptr make_derived();
  17.  
  18. #endif

swig_shared_ptr.cc

  1. #include <iostream>
  2. #include "swig_shared_ptr.h"
  3.  
  4. void do_something (base_sptr bs)
  5. {
  6. std::cout << "Doing something." << std::endl;
  7. }
  8.  
  9. base_sptr make_base() { return base_sptr(new Base ()); };
  10. derived_sptr make_derived() { return derived_sptr(new Derived ()); };

swig_shared_ptr.i

  1. %module(docstring="
  2. Example module showing problems I am having with SWIG,shared pointers
  3. and inheritance.
  4. ") swig_shared_ptr
  5.  
  6. %{
  7. #include "swig_shared_ptr.h"
  8. %}
  9.  
  10. %include <swig_shared_ptr.h>
  11. %include <boost_shared_ptr.i>
  12. %template(base_sptr) boost::shared_ptr<Base>;
  13. %template(derived_sptr) boost::shared_ptr<Derived>;

setup.py

  1. """
  2. setup.py file for swig_shared_ptr
  3. """
  4.  
  5. from distutils.core import setup,Extension
  6.  
  7. swig_shared_ptr_module = Extension('_swig_shared_ptr',include_dirs = ['/usr/include/boost'],sources=['swig_shared_ptr.i','swig_shared_ptr.cc'],)
  8.  
  9. setup (name = 'swig_shared_ptr',version = '0.1',author = "Ben",description = """Example showing problems I am having with SWIG,shared
  10. pointers and inheritance.""",ext_modules = [swig_shared_ptr_module],py_modules = ["swig_shared_ptr"],)

test.py

  1. import swig_shared_ptr as ssp
  2.  
  3. bs = ssp.make_base()
  4. dr = ssp.make_derived()
  5.  
  6. # Works fine.
  7. ssp.do_something(bs)
  8. # Fails with "TypeError: in method 'do_something',argument 1 of type 'base_sptr'"
  9. ssp.do_something(dr)

解决方法

以下更改似乎可以解决问题.

在swig_shared_ptr.i中有两行:

  1. %template(base_sptr) boost::shared_ptr<Base>;
  2. %template(derived_sptr) boost::shared_ptr<Derived>;

被移动,以便它们在线上方

  1. %include <swig_shared_ptr.h>

然后通过以下方式替换(在SWIG 1.3中):

  1. SWIG_SHARED_PTR(Base,Base)
  2. SWIG_SHARED_PTR_DERIVED(Derived,Base,Derived)

或(在SWIG 2.0中):

  1. %shared_ptr(Base)
  2. %shared_ptr(Derived)

猜你在找的C&C++相关文章