Ошибка аргумента SWIG при использовании "using std::vector" в python
Это очень связано с этим вопросом
Независимо от того, является ли это практикой кодирования, я сталкивался с кодом, который выглядит следующим образом
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 >'
Это можно исправить, изменив using std::vector
в test.hh до using namespace std
или удалив using std::vector
и меняется vector<double>
в std::vector<double>
, Это не то, что я хочу.
Проблема в том, что мне дали этот код как есть. Мне не разрешено вносить изменения, но я по-прежнему должен делать все доступным в Python через SWIG. Что тут происходит?
Заранее спасибо.
1 ответ
Для меня это выглядит как 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++.