这与this问题
非常相关无论这是否是编码实践,我都遇到过类似的代码
test.hh
#include <vector>
using std::vector;
class Test
{
public:
vector<double> data;
};
我正在尝试使用以下接口文件
使用swig3.0来进行此操作test.i
%module test_swig
%include "std_vector.i"
namespace std {
%template(VectorDouble) vector<double>;
};
%{
#include "test.hh"
%}
%naturalvar Test::data;
%include "test.hh"
以下测试代码
test.py
t = test.Test()
jprint(t)
a = [1, 2, 3]
t.data = a # fails
这样做会给我以下错误
in method 'Test_data_set', argument 2 of type 'vector< double >'
可以通过将test.hh中的using std::vector
更改为using namespace std
或删除using std::vector
并将vector<double>
更改为std::vector<double>
来解决此问题。这不是我想要的。
问题是我按原样获得了此代码。我不允许进行更改,但我应该仍然通过SWIG在python中提供所有内容。这里发生了什么?
提前致谢。
答案 0 :(得分:2)
对我而言,这看起来像SWIG不正确支持using std::vector;
语句。我认为这是一个SWIG错误。我可以想到以下解决方法:
using namespace std;
添加到SWIG接口文件中(这只会影响包装器的创建方式; using
语句不会输入C ++代码)#define vector std::vector
添加到SWIG界面文件中(仅当vector
从未用作std::vector
时才会生效)vector
更改为std::vector
。这将导致SWIG生成正确的包装器,并且不会再影响C ++库代码。