C++在boost python中使用带有命名空间的自定义智能指针



我正在尝试在boost python中公开对象,该对象封装在一个自定义的封装指针中。

问题是:如果我将指针类声明放在命名空间中,那么boost python代码不会编译。如果我把它放在命名空间之外,一切都会好起来。

工作示例:

    // dummy smart MyPtr class
    template <typename T> class MyPtr {
    public:
        typedef T element_type;
        MyPtr(): px(0) {}
        MyPtr(T* p): px(p) {}
        // base operators
        T* operator->() { return px; }
        const T* operator->() const { return px; }
        T& operator*() { return *px; }
        const T& operator*() const { return *px; }
        // getters
        T* get() { return px; }
        const T* get() const { return px; }
    private:
        T* px;
    };

template <typename T> T* get_pointer(MyPtr<T> const& p) 
{
  return const_cast<T*>(p.get());
}

namespace boost 
{ 
namespace python 
{
  template <typename T> struct pointee<MyPtr<T> >   
  {
    typedef T type;
  };
}
}
.
.
.
BOOST_PYTHON_MODULE(CmiObjectsPython)
{
.
.
bp::scope classScope = class_<NS1::Class, boost::noncopyable, MyPtr<NS1::Class> >("className", no_init)
        .def("func", &NS1::Class::func);
.
.
}

不起作用的示例:

namespace NS2
{
    // dummy smart MyPtr class
    template <typename T> class MyPtr {
    public:
        typedef T element_type;
        MyPtr(): px(0) {}
        MyPtr(T* p): px(p) {}
        // base operators
        T* operator->() { return px; }
        const T* operator->() const { return px; }
        T& operator*() { return *px; }
        const T& operator*() const { return *px; }
        // getters
        T* get() { return px; }
        const T* get() const { return px; }
    private:
        T* px;
    };
}

template <typename T> T* get_pointer(NS2::MyPtr<T> const& p) 
{
  return const_cast<T*>(p.get());
}

namespace boost 
{ 
namespace python 
{
  template <typename T> struct pointee<NS2::MyPtr<T> >   
  {
    typedef T type;
  };
}
}
.
.
.
BOOST_PYTHON_MODULE(CmiObjectsPython)
{
.
.
bp::scope classScope = class_<NS1::Class, boost::noncopyable, NS2::MyPtr<NS1::Class> >("className", no_init)
        .def("func", &NS1::Class::func);
.
.
}

如果我加上:

using namespace NS2;

这没有效果。

我得到的错误围绕着类的get_pointer的不存在:/usr/include/boost/python/object/make_ptr_instance.hp:30:error:调用"get_pointer(const NS2::MyPtr&)"时没有匹配的函数(为了可读性,对模板错误进行了编辑——显然,在实现这一行之前,有20行跟踪

make_ptr_instance中的boost代码看起来像:

template <class Ptr>
static inline PyTypeObject* get_class_object(Ptr const& x)
{
    return get_class_object_impl(get_pointer(x));
}

因此,据我所知,没有真正的理由不让代码工作,因为get_pointer是定义的,并且正如boost python所期望的那样,它在命名空间之外。

我在这里错过了什么?

谢谢,最大

不幸的是,boost python的许多特性都没有得到很好的记录。正如我从你的代码中看到的,你需要移动

template <typename T> T* get_pointer(NS2::MyPtr<T> const& p) 
{
  return const_cast<T*>(p.get());
}

到包含MyPtr定义的同一命名空间中。像这样的

namespace NS2 
{
    template <typename T> T* get_pointer(MyPtr<T> const& p) 
    {
        return const_cast<T*>(p.get());
    }
}

相关内容

  • 没有找到相关文章

最新更新