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

Posted

技术标签:

【中文标题】C ++在boost python中使用带有命名空间的自定义智能指针【英文标题】:C++ using custom smart pointers with namespace in boost python 【发布时间】:2015-04-07 05:47:06 【问题描述】:

我正在尝试在 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.hpp:30: 错误:没有匹配函数调用'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 所期望的命名空间之外。

我在这里错过了什么?

谢谢, 最大。

【问题讨论】:

使用 NS2 或 NS22。 这显然是一个错字:-) 我总是在代码中使用 ns2。 (我在这里复制代码时手动编辑了命名空间名称,所以我在错误中打错了字,但是代码当然到处都使用相同的命名空间..) 【参考方案1】:

不幸的是,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());
    

【讨论】:

以上是关于C ++在boost python中使用带有命名空间的自定义智能指针的主要内容,如果未能解决你的问题,请参考以下文章

使用boost python编译在python代码内部调用的c ++代码时出错

使用带有 inline-c-cpp 的 C++ 库 (boost)

无法让 matplotlib 事件处理程序与 Boost.Python 一起使用

如何在带有 Swig 的 Python 中使用 float **?

boost python,使用除 main global 之外的命名空间

带有 c 模块的 Python 的性能