在 python 中使用 "using std::vector" 时出现 SWIG 参数错误

SWIG argument error when using "using std::vector" in python

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

提前致谢。

对我来说,SWIG 似乎没有正确支持 using std::vector; 语句。我认为这是一个 SWIG 错误。我可以想到以下解决方法:

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