Вернуть вектор <pair <int, int >> & из метода c ++ в список кортежей python, используя swig typemap

У меня много проблем при попытке обернуть метод c ++, который возвращает постоянную ссылку на вектор пар в список кортежей Python, используя%typemap(out).

В настоящее время у меня есть что-то вроде этого:

myclass.h:

#inlcude <vector>
using std::vector;
class MyClass {
private:
    const vector<pair<int,int>> & _myvector;
public:
    MyClass(const vector<pair<int,int>> & myvector );
    const vector<pair<int,int>> & GetMyVector() const;
}

myclass.cpp:

#include "myclass.h"

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

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

myclass.i: (проверка опущена)

%module MyClass
%include "std_vector.i"

namespace std {
    %template(vector_pair_int) vector<pair<int,int>>;
}

%typemap(in) (const vector_pair_int &){

    $1 = new vector<pair<int,int>>;
    int size = PyList_Size($input);
    for (int i=0; i<size; i++){
        PyObject *o = PyList_GetItem($input,i);
        PyObject *o1 = PyList_GetItem(o,0);
        PyObject *o2 = PyList_GetItem(o,1);
        $1->push_back(make_pair(PyInt_AsLong(o1),PyInt_AsLong(o2)))
}

}

%typemap(out) (const vector_pair_int &) {
    $result = PyList_New($1.size());
    vector<pair<int,int>>:: const_iterator it;
    int count=0;
    for (it= $1.begin(); it!= $1.end(); ++it){
        PyObject * tup = PyTuple_Pack(2, it->first,it->second);
        PyList_SET_ITEM($result,count,tup);
        count++;
    }
}

Итак, первое, что я не совсем понимаю, это то, что предыдущий код для typemap (out) не компилируется, потому что он говорит мне, что $ 1 является указателем на контейнер, а не ссылкой. Когда я изменяю использование $ 1 в качестве указателя, он компилируется, но не работает.

Во-вторых, в случае компиляции работает typemap (in) (контейнер c ++ заполнен правильно), но когда я пытаюсь извлечь контейнер из python, я получаю мусор. Когда я передаю конструктору что-то вроде MyClass ([(1,2)]), а затем я использую GetMyVector (), он возвращает список Python, но размером 3 и с мусором в кортежах ... что я делаю неправильно ???

Ответы на вопрос(1)

Ваш ответ на вопрос