Строка определения так важна ...... но она так ... незаметна в то же время. Интересно, как ты это нашел.
лкиваюсь с аналогичной проблемойWrap std :: vector из std :: vectors, C ++ SWIG Python - но это не просто синтаксический анализ C ++. У меня есть следующее в моем коде C ++
namespace ns {
typedef unsigned long long uint64_t;
typedef std::vector<uint64_t> Vector;
typedef std::vector<Vector> VectorOfVectors;
class MyClass {
/// ...
/// Returns a reference to the internal vector allocated in C++ land
const VectorOfVectors &GetVectors() const;
};
}
И в обертке SWIG
%module myswig
// ...
%template(Uint64V) std::vector<ns::uint64_t>;
%template(VUint64V) std::vector<std::vector<ns::uint64_t> >;
Таким образом, упаковка работает нормально, включая класс, и я могу получить вектор векторов класса ОК:
import myswig
m = myswig.MyClass()
v = m.GetVectors()
print v
Что дает мне:
<myswig.VUint64V; proxy of <Swig Object of type 'std::vector< std::vector< ns::uint64_t,std::allocator< ns::uint64_t > > > *' at 0x994a050> >
Но если я получаю доступ к элементу в векторе, я не получаю прокси, который является myswig.Uint64V - и это моя проблема.
x = v[0]
print x
Я надеюсь получить это:
<myswig.Uint64V; proxy of <Swig Object of type 'std::vector< ns::uint64_t, std::allocator< ns::uint64_t > > *' at 0x994a080> >
Вместо этого я получаю:
(<Swig Object of type 'ns::uint64_t *' at 0x994a080>, <Swig Object of type 'ns::uint64_t *' at 0x994a098>)
То есть индекс в векторе векторов дает мне кортеж из 2-х элементов, а не прокси для нужного мне векторного класса (так что доступ к внутреннему вектору так же прост, как и к другим векторам).
Я также получаю предупреждение:
swig/python detected a memory leak of type 'ns::uint64_t *', no destructor found.
потому что для этого типа не определен деструктор.
Есть идеи?