我想在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))
;
}
我得到一个关于“无法实例化抽象类[...]的编译错误 纯虚函数未定义“”参见'foo :: a'的声明“
答案 0 :(得分:4)
在为Bar::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),
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&)’
答案 1 :(得分:3)
以下代码为我编译。在你的python Bar子类中,你应该能够从b方法返回一个Foo实例。
#include <boost/python.hpp>
class Foo
{
public:
virtual ~Foo() {}
virtual int a() = 0;
};
class Bar
{
public:
virtual ~Bar() {}
virtual Foo const& b() = 0;
};
class FooWrap : public Foo, public boost::python::wrapper<Foo>
{
public:
int a()
{
return this->get_override("a")();
}
};
class BarWrap : public Bar, public boost::python::wrapper<Bar>
{
public:
Foo const& b()
{
return this->get_override("b")();
}
};
BOOST_PYTHON_MODULE(foobar)
{
boost::python::class_<FooWrap, boost::noncopyable>("Foo")
.def("a", boost::python::pure_virtual(&Foo::a)) ;
boost::python::class_<BarWrap, boost::noncopyable>("Bar")
.def("b", boost::python::pure_virtual(&Bar::b), boost::python::return_internal_reference<>());
}