C++ 在 boost python 中使用带有命名空间的自定义智能指针
C++ using custom smart pointers with namespace in boost python
我正在尝试在 boost python 中公开对象,包裹在自定义包裹指针中。
问题:
如果我将指针 class 声明放在命名空间中,则 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;
这没有效果。
我得到的错误是 class 的 get_pointer 不存在:
/usr/include/boost/python/object/make_ptr_instance.hpp:30: 错误:没有匹配函数来调用 'get_pointer(const NS2::MyPtr&)'
(为了便于阅读,模板错误已被编辑 - 显然有 20 行轨迹,直到实现此行。
make_ptr_instance 中的提升代码如下所示:
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());
}
}
我正在尝试在 boost python 中公开对象,包裹在自定义包裹指针中。
问题: 如果我将指针 class 声明放在命名空间中,则 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;
这没有效果。
我得到的错误是 class 的 get_pointer 不存在: /usr/include/boost/python/object/make_ptr_instance.hpp:30: 错误:没有匹配函数来调用 'get_pointer(const NS2::MyPtr&)' (为了便于阅读,模板错误已被编辑 - 显然有 20 行轨迹,直到实现此行。
make_ptr_instance 中的提升代码如下所示:
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());
}
}