2011-11-16 59 views
5

Tôi có một API C++ Tôi đang cố gắng bọc trong Python. Tôi muốn gọi một hàm C++ được gói như là một đối số sau đây C++ typedefTruy cập C++ typedef bằng Python sử dụng SWIG

/* my_header.h */ 

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

trong đó Foo là một lớp C++. Tôi đã xoay sở để bọc hàm và lớp Foo cơ bản, nhưng tôi không biết cách tạo ra vectơ của Foo. Tôi bao gồm các tập tin .h trong SWIG tập tin .i của tôi như sau

/* my_interface.i */ 

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

%include "my_header.h" 

Tôi cũng đã cố gắng gói các std :: vector mẫu trong SWIG, như sau

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

này hoạt động, và tôi có thể nhập khẩu vector_foo bằng Python. Tuy nhiên, khi tôi gửi một vector_foo như một đối số cho hàm được đề cập ở trên, tôi nhận được một TypeError. Tôi cũng không thể cư ngụ vector_foo với Foo.

Trong Python tôi thực hiện như sau

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

Hoặc nếu tôi có thể làm cho thực hiện riêng của tôi về vector của Foo làm việc, hoặc bằng cách nào đó truy cập vào C++ typedef trực tiếp. Tôi đang gọi SWIG và biên dịch bằng cách sử dụng Python Distutils.

Cảm ơn bạn đã trợ giúp!

Trả lời

2

Tôi đã giải quyết.

Có vẻ như vấn đề là tôi đã phải nói SWIG về typedef đã hiện diện trong thư mục% {%} niềng răng trong file giao diện, tức là

/* my_interface.i */ 

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

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

Mặc dù tôi không phải là 100% rằng đây là sai lầm. Trong mọi trường hợp, bây giờ tôi có một tệp giao diện giống như tệp trên và các tác phẩm gói.

+0

Thực tế là bạn xác định typdef trước khi ''% include'' có vấn đề không? Tôi đã giả định rằng bạn cần định nghĩa nó sau khi bạn thực hiện trong ''% {...%} '', nó xuất hiện sau '' # include'' – spencerlyon2

Các vấn đề liên quan