c – 如何使用返回引用的方法将boost-python包装为虚拟类
发布时间:2020-12-16 09:40:06 所属栏目:百科 来源:网络整理
导读:我有两个虚拟类,我想在boost python中包装,我希望能够编写扩展它们的 Python类.问题是,其中一个类有一个返回另一个类的引用的方法,我无法想象该怎么做. 这是要包装的类的代码的简化版本. class Foo{ public: virtual ~Foo() {} virtual int a() = 0;};class
我有两个虚拟类,我想在boost
python中包装,我希望能够编写扩展它们的
Python类.问题是,其中一个类有一个返回另一个类的引用的方法,我无法想象该怎么做.
这是要包装的类的代码的简化版本. class Foo { public: virtual ~Foo() {} virtual int a() = 0; }; class Bar { public: virtual ~Bar() {} virtual Foo const& b() = 0; }; 所以我开始以这种方式包装. class FooWrap : public Foo,public wrapper<Foo> { public: int a() { return this->get_override("a")(); } }; class BarWrap : public Bar,public wrapper<Bar> { public: Foo const& b() { return this->get_override("b")(); } }; BOOST_PYTHON_MODULE(foobar) { class_<FooWrap,boost::noncopyable>("Foo") .def("a",pure_virtual(&Foo::a)) ; class_<BarWrap,boost::noncopyable>("Bar") .def("b",pure_virtual(&Bar::b)) ; } 我得到一个关于“无法实例化抽象类[…]的编译错误 解决方法
在为Bar :: b函数添加调用策略后,我已经能够编译并运行代码:
BOOST_PYTHON_MODULE(foobar) { class_<FooWrap,pure_virtual(&Foo::a)); class_<BarWrap,pure_virtual(&Bar::b),return_internal_reference<>()); } 基本上,它只是意味着从Bar :: b返回引用的生命周期应该取决于Bar实例的生命周期.您可以在boost docs中阅读有关呼叫策略的信息. 你使用什么编译器和升级版本?我对boost 1.46.0和gcc 4.6.1有以下描述性错误: error: no match for call to ‘(const boost::python::detail::specify_a_return_value_policy_to_wrap_functions_returning<const Foo&>) (const Foo&)’ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |