我试图让Boost Python与std :: shared_ptr很好地配合。目前,我收到此错误:
Traceback (most recent call last):
File "test.py", line 13, in <module>
comp.place_annotation(circle.centre())
TypeError: No to_python (by-value) converter found for C++ type: std::shared_ptr<cgl::Anchor>
从调用circle.centre(),它返回一个std :: shared_ptr。我可以将每个std :: shared_ptr更改为boost :: shared_ptr(Boost Python可以很好地使用),但是要改变的代码量相当大,我想使用标准库。
circle方法声明如下:
const std::shared_ptr<Anchor> centre() const
{
return Centre;
}
这样的锚类:
class Anchor
{
Point Where;
Annotation* Parent;
public:
Anchor(Annotation* parent) :
Parent(parent)
{
// Do nothing.
}
void update(const Renderer& renderer)
{
if(Parent)
{
Parent->update(renderer);
}
}
void set(Point point)
{
Where = point;
}
Point where() const
{
return Where;
}
};
相关的Boost Python代码是:
class_<Circle, bases<Annotation> >("Circle", init<float>())
.def("radius", &Circle::radius)
.def("set_radius", &Circle::set_radius)
.def("diameter", &Circle::diameter)
.def("top_left", &Circle::top_left)
.def("centre", &Circle::centre);
// The anchor base class.
class_<Anchor, boost::noncopyable>("Anchor", no_init)
.def("where", &Anchor::where);
我正在使用Boost 1.48.0。有什么想法吗?
答案 0 :(得分:16)
看起来boost :: python不支持C ++ 11 std :: shared_ptr。
如果您查看文件boost / python / converter / shared_ptr_to_python.hpp,您将找到boost :: shared_ptr的模板函数shared_ptr_to_python(shared_ptr&lt; T&gt; const&amp; x)的实现(它解释了为什么代码工作正常for boost :: shared_ptr)。
我认为你有几种选择:
答案 1 :(得分:6)
除非我误解了,否则我认为这可以解决你的问题:
boost::python::register_ptr_to_python<std::shared_ptr<Anchor>>();
http://www.boost.org/doc/libs/1_57_0/libs/python/doc/v2/register_ptr_to_python.html
答案 2 :(得分:1)
有一个错误报告: https://svn.boost.org/trac/boost/ticket/6545
看起来有人正在研究它。
答案 3 :(得分:1)
/* make boost::python understand std::shared_ptr */
namespace boost {
template<typename T>
T *get_pointer(std::shared_ptr<T> p)
{
return p.get();
}
}
为我工作。您可以定义类:
class_<foo, std::shared_ptr<foo>>("Foo", ...);
有了这个,返回std::shared_ptr<foo>
的其他方法将会正常工作。
虚函数/多态可能需要一些魔力,这应该在我链接的线程中介绍。