повторить возвращенный вектор & lt; pair & lt; int, int & gt; & gt; в питоне от привязок SWIG

Я нашел этот очень полезный вопрос и ответ:
Вектор возврата<пара<INT, INT>> & из метода c ++ в список кортежей python с использованием swig typemap

Однако у меня есть некоторые проблемы с повторением вектора возврата, если это не ссылка, вот пример:

myclass.h:

#include <vector>
#include <utility>

using std::vector;
using std::pair;
class MyClass {
private:
vector<pair<int,int> > _myvector;

public:
MyClass( );
const vector<pair<int,int> > & GetMyVector() const;
};

myclass.cpp:

#include "myclass.h"
MyClass::MyClass(): _myvector()
{_myvector.push_back(std::make_pair(1,2));_myvector.push_back(std::make_pair(1,2));};

const vector<pair<int,int>> & MyClass::GetMyVector() const {
return _myvector;
};

myclass.i:

%module x

%include <std_pair.i>
%include <std_vector.i>
%include <std_string.i>
%template() std::pair<int,int>;
%template(PairVector) std::vector<std::pair<int,int> >;

%{
#include "myclass.h"%}

%include "myclass.h"

составлено с:

g++ -std=c++11 -c -fPIC myclass.cpp
swig -c++ -v -python myclass.i
g++ -std=c++11 -fPIC -c myclass.cpp myclass_wrap.cxx -I/usr/include/python2.7
g++ myclass.o myclass_wrap.o -shared -fPIC -o _x.so

но когда я запускаю что-то подобное в python:

import x

b=x.MyClass()

print(b.GetMyVector())

for a,b in b.GetMyVector():
print(a,b)

тогда я получаю:

<Swig Object of type 'vector< std::pair< int,int >,std::allocator< std::pair< int,int > > > *' at 0x7ff06804b1b0>Traceback (most recent call last):
File "Test.py", line 6, in <module>
for a,b in b.GetMyVector():
TypeError: 'SwigPyObject' object is not iterable

Как правильно перебрать возвращаемый вектор в python? И почему возвращается указатель на вектор? Нужно ли что-то менять в файле swig?

В случае, если это актуально: (на Ubuntu)

  • SWIG версия 2.0.11
  • g ++ (Ubuntu 4.9.4-2ubuntu1 ~ 14.04.1) 4.9.4
  • Python 2.7.6

1

Решение

SWIG не понимает using Директива правильно.

То же, что в этом вопросе и ответе:
Ошибка аргумента SWIG при использовании "используя std :: vector" в питоне

Что касается того, почему указатель возвращается, хорошо, если SWIG не может преобразовать возвращенный объект в объект python, то он оборачивает указатель на объект.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]