Мне не удается получить действительный вывод SWIG из определения, подобного этому:
std::vector< namespaceA::refPtr< namespaceB::myObj > >
Прежде всего, у меня есть собственное определение std :: vector
namespace std {
template<class T> class vector {
public:
typedef size_t size_type;
typedef T value_type;
typedef value_type const& const_reference;
/*
....
*/
%rename(add) push_back;
void push_back( const_reference x);
%extend {
const_reference get(int i) {
int size = int(self->size());
if (i>=0 && i<size)
return (*self)[i];
else
return *((T*)NULL);
}
void set(int i, const_reference val) {
int size = int(self->size());
if (i>=0 && i<size)
(*self)[i] = val;
}
}
};
}
В пространстве имен A есть шаблон для ссылки на указатели. Давайте назовем это refPtr
.
В пространстве имен B есть класс с подсчетом ссылок, который называется MyObj
.
Когда я объявляю шаблон для объекта с подсчетом ссылок, SWIG выводит правильный интерфейс:
%template(MyObjRefPtr) namespaceA::refPtr< namespaceB::MyObj > // OK
Тогда я объявляю мой вектор:
%template(MyObjRefPtrVector) std::vector< MyObjRefPtr > > // compiles but inner types not resolved
Компилируется, а SWIG генерирует четыре типа:
- SWIGTYPE_p_std_ vectorTnamespaceA _refPtrTnamespaceB__MyObj_t_t
- SWIGTYPE_p_MyObjRefPtr
- MyObjRefPtr
- MyObjRefPtrVector
Сгенерированный класс MyObjRefPtr
в порядке.
Класс MyObjRefPtrVector
создан, но методы add
, set
и get
принимают SWIGTYPE_p_MyObjRefPtr
в качестве параметра вместо MyObjRefPtr
.
Может кто-нибудь показать мне, где мой код неверен? Я просто не могу понять это ...