Ошибка аргумента 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++.
Другие вопросы по тегам