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!
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