Error de argumento SWIG al usar “using std :: vector” en python

Esto está muy relacionado con esta pregunta.

Independientemente de si esto es o no una práctica de encoding, me he encontrado con un código que se ve así

prueba.hh

#include  using std::vector; class Test { public: vector data; }; 

Estoy intentando cambiar esto usando swig3.0 usando el siguiente archivo de interfaz

test.i

 %module test_swig %include "std_vector.i" namespace std { %template(VectorDouble) vector; }; %{ #include "test.hh" %} %naturalvar Test::data; %include "test.hh" 

Y el siguiente código de prueba.

test.py

 t = test.Test() jprint(t) a = [1, 2, 3] t.data = a # fails 

Al hacerlo me da el siguiente error

 in method 'Test_data_set', argument 2 of type 'vector' 

Esto puede solucionarse cambiando el using std::vector en test.hh para using namespace std o eliminando el using std::vector y cambiando el vector a std::vector . Esto no es lo que quiero.

El problema es que me dieron este código tal como está. No se me permite hacer cambios, pero se supone que debo hacer que todo esté disponible en Python a través de SWIG. ¿Que está pasando aqui?

Gracias por adelantado.

Para mí, esto parece que SWIG no admite el using std::vector; statement correctamente. Creo que es un error SWIG. Puedo pensar en las siguientes soluciones:

  • Añadir using namespace std; al archivo de interfaz SWIG (esto solo afectará la forma en que se crean envoltorios; la statement de using no ingresará el código C ++)
  • Agregue #define vector std::vector al archivo de interfaz SWIG (esto solo funcionará si el vector nunca se usa como std::vector )
  • Copie las declaraciones del archivo de encabezado al archivo de interfaz SWIG y cambie vector a std::vector . Esto hará que SWIG genere envoltorios correctos, y de nuevo no afectará el código de la biblioteca de C ++.