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

pybind11封装时调用非静态成员函数传引用报Illegal Call错误

问题解决方案

报错根因

  • 非静态成员函数必须通过类实例调用,你原有封装的lambda中没有传入类实例,直接调用Example::iterate属于非法调用
  • 原有代码中&Example::iterate(k, i)语法错误,混淆了成员函数取地址和调用的逻辑
  • Python原生数值为不可变对象,无法直接修改传入参数的原值,需要通过返回值同步修改后的结果

修正后的封装代码

ex.def("iterate", [](Example& self, double k, const double i) {
    // 通过类实例调用成员函数
    bool b = self.iterate(k, i);
    // 以元组形式返回执行结果和修改后的k值
    return std::make_tuple(b, k);
});

Python侧调用方式

ins = Example()
k = 0.5
# 解包返回值覆盖原变量,实现值同步
res, k = ins.iterate(k, 1.2)

注意:你当前贴出的C++ iterate 方法逻辑存在疏漏:你声明了引用类型的入参k,但函数内部仅修改了类成员_k,完全没有操作入参k,这种写法就算在原生C中调用,也无法修改外部传入的k变量的值。如果要实现修改传入k的需求,调整C方法逻辑即可:

bool iterate(double & k, const double i)
{   
    if (i < k)
    {
        return false;
    }
    k++; // 修改传入的引用参数k
    return true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:57:04