2011-11-16 18 views
5

Tengo una API de C++ que estoy tratando de envolver en Python. Quiero llamar a una función myfunc C++ envuelta tomando como argumento la siguiente C++ typedefAccediendo a typedef de C++ en Python usando SWIG

/* my_header.h */ 

namespace my_namespace { 
typedef std::vector<Foo> Bar 
} 

donde foo es una clase de C++. Logré envolver la función y la clase subyacente Foo, pero no sé cómo crear el vector de Foo. He incluido el archivo .h en mi archivo .i TRAGO de la siguiente manera

/* my_interface.i */ 

%{ 
#include "my_header.h" 
typedef my_namespace::Bar Bar; 
%} 

%include "my_header.h" 

También probé envolviendo el std :: vector de plantilla en el TRAGO, de la siguiente manera

%include std_vector.i 
namespace std { 
    %template(vector_foo) vector<Foo>; 
} 

Esto funciona, y puedo importar vector_foo en Python. Sin embargo, cuando envío un vector_foo como argumento a la función mencionada anteriormente, obtengo un TypeError. Tampoco puedo llenar vector_foo con Foo.

En Python hago lo siguiente

>>> a = mymodule.vector_foo() 
>>> a 
<Swig Object of type 'std::vector <Foo, std::allocator<Foo> > *' 
>>> mymodule.myfunc(a, 'string') 
TypeError: in method 'myfunc', argument 1 of type 'my_namespace::Bar &' 

O si puedo hacer mi propia implementación de vector de trabajo Foo, o de alguna manera acceder al C++ typedef directamente. Llamaré a SWIG y compilaré usando Python Distutils.

¡Gracias por cualquier ayuda!

Respuesta

2

Lo resolví.

parece que el problema era que tenía que decir acerca de la TRAGO typedef ya presente en el%% {} Las llaves en el archivo de interfaz, es decir

/* my_interface.i */ 

%{ 
#include "my_header.h" 
typedef my_namespace::Bar Bar; 
%} 

typedef my_namespace::Bar Bar; 
%include "my_header.h" 

Aunque no estoy 100% que esta era la Error. En cualquier caso, ahora tengo un archivo de interfaz como el anterior y el ajuste funciona.

+0

¿El hecho de que defina el typdef antes del asunto ''% include''? Hubiera supuesto que necesita definirlo después del mismo modo que lo hace en ''% {...%} '', donde aparece después de '' # include'' – spencerlyon2