在python中使用“using std :: vector”时SWIG参数错误

时间:2016-06-29 23:58:42

标签: python c++ c++11 vector swig

这与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中提供所有内容。这里发生了什么?

提前致谢。

1 个答案:

答案 0 :(得分:2)

对我而言,这看起来像SWIG不正确支持using std::vector;语句。我认为这是一个SWIG错误。我可以想到以下解决方法:

  • using namespace std;添加到SWIG接口文件中(这只会影响包装器的创建方式; using语句不会输入C ++代码)
  • #define vector std::vector添加到SWIG界面文件中(仅当vector从未用作std::vector时才会生效)
  • 将声明从头文件复制到SWIG接口文件,并将vector更改为std::vector。这将导致SWIG生成正确的包装器,并且不会再影响C ++库代码。