在 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++ 库代码。
这与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++ 库代码。