pybind11绑定含trampoline、多继承std::enable_shared_from_this的类编译失败如何解决?
问题根因
该编译错误是pybind11的holder类型推导冲突导致的:
- 类
B继承了std::enable_shared_from_this<B>,pybind11会默认尝试用std::shared_ptr<B>作为B实例的内存持有类型(holder) - 你在
py::class_模板参数中没有显式指定holder,也没有按顺序声明所有父类,导致pybind11错误使用了默认的std::unique_ptr<B>作为holder,两种智能指针无法转换就触发了报错。
修复方案
仅需要修改B的绑定语句,严格按照py::class_的模板参数顺序声明即可:
- 模板参数顺序要求:
[目标类], [trampoline类(可选)], [所有父类...], [holder类型(可选)] - 多继承场景必须显式加
py::multiple_inheritance()构造参数
修复后的绑定代码:
py::class_<B, PyB, A, std::enable_shared_from_this<B>, std::shared_ptr<B>>(m, "B", py::multiple_inheritance()) .def( py::init<>() ) .def( "fA", &B::fA ) .def( "fB", &B::fB );
额外说明
- 不需要修改你的
PyA、PyBtrampoline类实现 - 显式指定
std::shared_ptr<B>作为holder可以避免pybind11在多继承+trampoline场景下的类型推导错误
内容的提问来源于stack exchange,提问作者Naum
相关产品推荐
相关产品推荐

