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
相关产品推荐
相关产品推荐

