gpt4 book ai didi

c++ - SWIG, boost 共享指针和继承

转载 作者:太空狗 更新时间:2023-10-29 21:44:38 25 4
gpt4 key购买 nike

我在 SWIG、共享指针和继承方面遇到了麻烦。

我正在创建各种相互继承的 C++ 类,使用 boost 共享指针来引用它们,然后包装这些共享使用 SWIG 的指针来创建 python 类。

我的问题如下:

  • B是A的子类
  • sA 是指向 A 的共享指针
  • sB 是指向 B 的共享指针
  • f(sA) 是一个需要指向 A 的共享指针的函数

  • 如果我将 sB 传递给 f(),则会引发错误。

  • 此错误仅发生在 python 级别。
  • 在 C++ 级别,我可以毫无问题地将 sB 传递给 f()。

我有 boost 1.40 和 swig 1.3.40。

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

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

swig_shared_ptr.h

#ifndef INCLUDED_SWIG_SHARED_PTR_H
#define INCLUDED_SWIG_SHARED_PTR_H

#include <boost/shared_ptr.hpp>

class Base {};

class Derived : public Base {};

typedef boost::shared_ptr<Base> base_sptr;
typedef boost::shared_ptr<Derived> derived_sptr;

void do_something (base_sptr bs);

base_sptr make_base();
derived_sptr make_derived();

#endif

swig_shared_ptr.cc

#include <iostream>
#include "swig_shared_ptr.h"

void do_something (base_sptr bs)
{
std::cout << "Doing something." << std::endl;
}

base_sptr make_base() { return base_sptr(new Base ()); };
derived_sptr make_derived() { return derived_sptr(new Derived ()); };

swig_shared_ptr.i

%module(docstring="
Example module showing problems I am having with SWIG, shared pointers
and inheritance.
") swig_shared_ptr

%{
#include "swig_shared_ptr.h"
%}

%include <swig_shared_ptr.h>
%include <boost_shared_ptr.i>
%template(base_sptr) boost::shared_ptr<Base>;
%template(derived_sptr) boost::shared_ptr<Derived>;

setup.py

"""
setup.py file for swig_shared_ptr
"""

from distutils.core import setup, Extension

swig_shared_ptr_module = Extension('_swig_shared_ptr',
include_dirs = ['/usr/include/boost'],
sources=['swig_shared_ptr.i', 'swig_shared_ptr.cc'],
)

setup (name = 'swig_shared_ptr',
version = '0.1',
author = "Ben",
description = """Example showing problems I am having with SWIG, shared
pointers and inheritance.""",
ext_modules = [swig_shared_ptr_module],
py_modules = ["swig_shared_ptr"],
)

测试.py

import swig_shared_ptr as ssp

bs = ssp.make_base()
dr = ssp.make_derived()

# Works fine.
ssp.do_something(bs)
# Fails with "TypeError: in method 'do_something', argument 1 of type 'base_sptr'"
ssp.do_something(dr)

最佳答案

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

swig_shared_ptr.i 两行:

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

被移动到线的上方

%include <swig_shared_ptr.h>

然后(在 SWIG 1.3 中)被替换为:

SWIG_SHARED_PTR(Base, Base)
SWIG_SHARED_PTR_DERIVED(Derived, Base, Derived)

或(在 SWIG 2.0 中)通过:

%shared_ptr(Base)
%shared_ptr(Derived)

关于c++ - SWIG, boost 共享指针和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4710037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com