SWIG: нераспознанный тип шаблона содержится в векторе - PullRequest
0 голосов
/ 02 мая 2011

Мне не удается получить действительный вывод 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.

Может кто-нибудь показать мне, где мой код неверен? Я просто не могу понять это ...

1 Ответ

0 голосов
/ 03 мая 2011

Вместо

%template(MyObjRefPtrVector) std::vector< MyObjRefPtr > >

объявление шаблона должно быть

%template(MyObjRefPtrVector) std::vector< namespaceA::refPtr< namespaceB::MyObj > >
...