2011-11-16 11 views
5

私はPythonでラップしようとしているC++ APIを持っています。私は、引数としてfooがC++クラスであるSWIGを使用してPythonでC++ typedefにアクセスする

/* my_header.h */ 

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

typedefを次のC++を取って包んC++の関数myfunc関数を呼び出したいです。関数と基本クラスFooをラップすることができましたが、Fooのベクトルを作成する方法はわかりません。この作品

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

次のように、私ものstd :: SWIGのベクトルテンプレートをラップしようとした

/* my_interface.i */ 

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

%include "my_header.h" 

を次のように私は私のSWIG .iファイルで.hファイルを含めて、私はインポートすることができますPythonのvector_fooしかし、上記の関数にvector_fooを引数として渡すと、TypeErrorが返されます。 vector_fooにFooを設定することもできません。

私はFooの作業のベクトルの私の独自の実装を行い、または何らかの形で直接C++のtypedefにアクセスできる場合、私はどちらか

>>> 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 &' 

を次の操作を行いPythonで

。私はSWIGを呼び出し、Python Distutilsを使ってコンパイルしています。

ありがとうございました!

答えて

2

私はそれを解決しました。

私は%{%}にすでに存在しているのtypedefについてSWIGに教えなければならなかった問題は、インタフェースファイルにブレースのように、私はこれがあったことを100%ではないですが、つまり

/* my_interface.i */ 

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

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

、思えます間違い。いずれにせよ、私は今、上記のようなインターフェイスファイルを持ち、ラッピングを行います。

+0

''%include''の前にtypdefを定義するという事実は重要ですか? ''%{...%} ''のように、 '' #include''の後に来るように定義する必要があると思います – spencerlyon2

関連する問題