这个问题在某些方面是此处发布的问题的扩展: 带有模板类的 SWIG_SHARED_PTR 宏 虽然这个问题可能完全不相关。
基本设置是这样的:我试图让 SWIG 将模板类包装为 shared_ptr。所以接口文件应该是这样的
%shared_ptr(template_instance)
%include template_class.cpp
%template(vector_instance) template_class<int>;
现在的问题是template_class
有很多派生类,这会在 swig 中导致很多警告,然后构建错误。这些类不需要作为shared_ptr
's 处理,所以我宁愿忽略上面代码生成的警告。该错误的解决方案似乎是:
%shared_ptr(template_derived1)
%shared_ptr(template_derived2)
.
.
.
%shared_ptr(template_derivedn)
%shared_ptr(template_instance)
%include template_class.cpp
%template(vector_instance) template_class<int>;
这可行,但是很混乱,我认为将所有内容都表示为 shared_ptr 一定有一些缺点(它是什么?)。这附近有人吗?
编辑:更新具体示例
测试.h
class Base
{
int base_member;
};
class Derived : public Base
{
int derived_member;
};
测试.i
%module test
%{
#include "test.h"
#include <boost/shared_ptr.hpp>
%}
%include <boost_shared_ptr.i>
%shared_ptr(Base)
%include test.h
命令:
swig -python -c++ test.i
g++ -fPIC -I /usr/include/python2.7 -c test_wrap.cxx
在这个精简的例子中,swig 调用给出警告,而 g++ 调用给出错误。请注意,我已经删除了模板,因为它似乎不是问题的一个因素。
错误通过注释掉解决
%shared_ptr(Base)
swig 生成的警告是:
test.h:10: Warning 520: Derived class 'Derived' of 'Base' is not similarly marked as a smart pointer
来自 g++ 的错误是:
test_wrap.cxx: In function ‘PyObject* _wrap_delete_Derived(PyObject*, PyObject*)’:
test_wrap.cxx:3155:22: error: ‘smartarg1’ was not declared in this scope