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

传递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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:33:13