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

发布于 2024-11-04 21:26:24 字数 1724 浏览 3 评论 0原文

我无法从这样的定义中获得有效的 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 已生成,但方法 addsetget 采用 SWIGTYPE_p_MyObjRefPtr > 作为参数,而不是 MyObjRefPtr

有人可以告诉我我的代码哪里错了吗?我就是想不通...

I can't manage to have a valid SWIG output from a definition like this :

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

First of all, I have a custom definition of 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;
        }
    }
};
}

In the namespace A, there is a template to reference pointers. Let's call it refPtr.
In the namespace B, there is a ref counted class, called MyObj.

When I declare a template for a ref counted object, SWIG outputs the correct interface :

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

Then I declare my vector :

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

It compiles and SWIG generates four types :

  • SWIGTYPE_p_std_vectorTnamespaceA_refPtrTnamespaceB__MyObj_t_t
  • SWIGTYPE_p_MyObjRefPtr
  • MyObjRefPtr
  • MyObjRefPtrVector

The generated class MyObjRefPtr is ok.
The class MyObjRefPtrVector was generated but the methods add, set and get take a SWIGTYPE_p_MyObjRefPtr as parameter, instead of MyObjRefPtr.

Could someone show me where my code is wrong ? I just can't figure it out...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

如果没结果 2024-11-11 21:26:24

而不是

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

模板声明应该是

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

Instead of

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

the template declaration should be

%template(MyObjRefPtrVector) std::vector< namespaceA::refPtr< namespaceB::MyObj > >
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文