2011-11-16 5 views
5

저는 C++ API가 있습니다. 파이썬으로 포장하려고합니다. 나는 푸는 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>; 
} 

다음과 같이 나 또한 표준 : 꿀꺽 꿀꺽 벡터 템플릿을 포장하려

/* my_interface.i */ 

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

%include "my_header.h" 

를 다음과 같이 내 꿀꺽 꿀꺽 .I 파일의 .H 파일을 포함, 나는 가져올 수 있습니다 파이썬에서 vector_foo. 그러나, 위에서 언급 한 함수에 vector_foo를 인수로 보내면 TypeError가 발생합니다. Foo로 vector_foo를 채울 수도 없습니다. 나는

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

다음을 수행 파이썬에서

어느 나는 형식 정의 직접 C++를 액세스 어떻게 든 푸 작업 벡터 내 자신의 구현을 만들거나 할 수 있습니다. 나는 SWIG를 호출하고 Python Distutils를 사용하여 컴파일합니다.

도움 주셔서 감사합니다.

답변

2

해결했습니다. 문제가 즉, 나는 % {%}에서 이미 존재하는 타입 정의 인터페이스 파일에 중괄호에 대한 꿀꺽 꿀꺽 얘기했다

/* my_interface.i */ 

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

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

있는 것처럼이이를 것을 100 % 야하지만

보인다 잘못. 어쨌든 위의 인터페이스 파일과 랩핑 작업이 있습니다.

+0

''% include'' 전에 typdef를 정의 했는가? 나는 당신이''% {... %}''에서와 같이 정의 할 필요가 있다고 가정했을 것입니다,''#include'' 다음에옵니다. – spencerlyon2

관련 문제