You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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、PyB trampoline类实现
  • 显式指定std::shared_ptr<B>作为holder可以避免pybind11在多继承+trampoline场景下的类型推导错误

内容的提问来源于stack exchange,提问作者Naum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:09:02