关于c ++:SWIG:向量中包含的无法识别的模板类型

SWIG : unrecognized template type contained in vector

我无法从这样的定义中获得有效的swig输出:

1
std::vector< namespaceA::refPtr< namespaceB::myObj > >

首先,我有一个std::vector的自定义定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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输出正确的接口:

1
%template(MyObjRefPtr) namespaceA::refPtr< namespaceB::MyObj > // OK

然后我声明我的向量:

1
%template(MyObjRefPtrVector) std::vector< MyObjRefPtr > > // compiles but inner types not resolved

它编译并生成四种类型:

  • swigtype_p_std_vectortnamespacea_refptrttnamespaceb_uu myobj_t_t
  • 开关类型
  • MyObjRefpPTR
  • MYobjRefptrVector(MYobjRefptrVector)

生成的类EDOCX1·2是可以的。生成EDOCX1×3的类,但addset和EDCX1〔6〕方法取EDCOX1〔7〕作为参数,而不是EDCX1〔2〕。

有人能告诉我我的代码哪里错了吗?我就是想不出来…


而不是

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

模板声明应为

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