如何避免包装抽象基类并解决Python调用派生类基类方法的错误?
问题解答
问题2:当前调用出错的原因
这个错误确实和const正确性直接相关,和Python的隐式self无关。
C++里ABC::getid()是const成员函数,实际签名隐含了const ABC*类型的this指针;但你绑定的时候直接写&ABC::getid,Boost.Python默认会把它当成非const成员函数处理,要求传入non-const的this指针。Python传入的D1实例符合const要求,但绑定的签名不匹配,因此抛出参数错误。
问题1:不定义基类包装器,使用基类非虚方法的解决办法
不需要为抽象基类ABC编写包装器,只要在绑定派生类时,正确处理基类const成员函数的绑定逻辑即可,具体有两种可行方式:
方式一:用const_修饰符明确标注
绑定过程中通过boost::python::const_指明这是一个const成员函数:
class_<D1, D1*>("D1", "...") .def("getid", &ABC::getid, const_()) ;
方式二:用make_function显式指定签名
通过make_function明确函数的const属性和返回值策略:
#include <boost/python/make_function.hpp> #include <boost/python/return_value_policy.hpp> class_<D1, D1*>("D1", "...") .def("getid", make_function( &ABC::getid, return_value_policy<copy_const_reference>(), // 根据需求选择返回值策略,避免悬空引用 (const ABC*)nullptr // 指明this指针为const类型 )) ;
完成上述绑定后,Python中调用d1.getid()即可正常工作,且无需将基类ABC暴露给Python环境。
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

