我有一个C ++ API,我试图用Python包装。我想调用一个包装的C ++函数myfunc,将以下C ++ typedef
作为参数/* my_header.h */
namespace my_namespace {
typedef std::vector<Foo> Bar
}
其中Foo是C ++类。我设法包装函数和底层类Foo,但我不知道如何创建Foo的向量。我将.h文件包含在我的SWIG .i文件中,如下所示
/* my_interface.i */
%{
#include "my_header.h"
typedef my_namespace::Bar Bar;
%}
%include "my_header.h"
我也尝试在SWIG中包装std :: vector模板,如下所示
%include std_vector.i
namespace std {
%template(vector_foo) vector<Foo>;
}
这很有效,我可以在Python中导入vector_foo。但是,当我将vector_foo作为参数发送到上面提到的函数时,我得到一个TypeError。我也不能用Foo填充vector_foo。
在Python中我执行以下操作
>>> a = mymodule.vector_foo()
>>> a
<Swig Object of type 'std::vector <Foo, std::allocator< Foo > > *'
>>> mymodule.myfunc(a, 'string')
TypeError: in method 'myfunc', argument 1 of type 'my_namespace::Bar &'
要么我可以自己实现Foo的vector工作,要么以某种方式直接访问C ++ typedef。我正在调用SWIG并使用Python Distutils进行编译。
感谢您的帮助!
答案 0 :(得分:2)
我解决了。
似乎问题是我必须告诉SWIG有关接口文件中%{%}括号中已经存在的typedef,即
/* my_interface.i */
%{
#include "my_header.h"
typedef my_namespace::Bar Bar;
%}
typedef my_namespace::Bar Bar;
%include "my_header.h"
虽然我不是100%这是错误的。无论如何,我现在有一个像上面那样的包装工具。