传递std::shared_ptr至nanobind类触发编译错误,求排查
问题原因与解决方法
错误根源
你遇到的编译错误是因为**nanobind/stl/shared_ptr.h仅适用于自定义C类的所有权共享**,而int是内置基本类型,nanobind已经为它注册了直接的类型转换器,不允许用shared_ptr<int>来传递——这不仅不符合nanobind的设计逻辑,从语义上看,Python的整数是不可变对象,也没法和C的shared_ptr<int>实现真正的所有权共享。
解决方案
根据你的需求,有两种修正方式:
方式1:不需要共享所有权,直接存储普通整数
如果只是需要让TestClass持有一个整数值,不需要在Python和C++之间共享同一个可变对象,直接改用普通int即可:
#include <nanobind/nanobind.h> class TestClass { public: int i; TestClass(int i) : i(i) {} }; NB_MODULE(test_module, m) { nanobind::class_<TestClass>(m, "TestClass") .def(nanobind::init<int>()); }
方式2:需要共享可变整数,包装为自定义类
如果确实需要在Python和C++之间共享一个可修改的整数,需要把int包装成一个自定义类,再用shared_ptr绑定:
#include <nanobind/nanobind.h> #include <nanobind/stl/shared_ptr.h> class IntHolder { public: int value; IntHolder(int v) : value(v) {} }; class TestClass { public: std::shared_ptr<IntHolder> i; TestClass(std::shared_ptr<IntHolder> i) : i(i) {} }; NB_MODULE(test_module, m) { // 先绑定自定义的IntHolder类 nanobind::class_<IntHolder>(m, "IntHolder") .def(nanobind::init<int>()) .def_rw("value", &IntHolder::value); // 暴露value属性供Python修改 // 再绑定TestClass nanobind::class_<TestClass>(m, "TestClass") .def(nanobind::init<std::shared_ptr<IntHolder>>()); }
这样在Python中创建IntHolder实例传给TestClass后,修改IntHolder.value会同时影响C++侧的数值,实现所有权共享。
内容的提问来源于stack exchange,提问作者Eliot Heinrich
相关产品推荐
相关产品推荐

