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

Cython中重载解引用运算符获取PPho内部shared_ptr指向的Pho对象

问题原因

报错的核心是get()是std::shared_ptr的成员方法,而你调用的对象是PPho类型,本身没有实现get()方法;同时PPho的PhoPtr是私有成员,你在Cython的pxd文件里声明私有成员也无法正常访问。
你可以直接用PPho已经公开的重载运算符实现需求,两种可行方案如下:


第一步:修正pxd头文件声明

首先删除pxd中私有成员PhoPtr的声明,修正重载运算符的声明格式:

from libcpp.memory cimport shared_ptr, weak_ptr

cdef cppclass Pho:
    Pho()
    Pho(Pho &Other)        

cdef cppclass PPho:
    PPho() except +
    PPho(const PPho &Other)
    PPho(const shared_ptr[Pho] &Other)
    PPho(std::nullptr_t)
    # 修正->运算符声明
    Pho* operator->() const
    # 声明类型转换运算符
    operator shared_ptr[Pho]() const
    operator weak_ptr[Pho]() const
    operator bool() const
    void Reset()

第二步:pyx实现文件修改,二选一即可

方案1:直接用重载的->运算符获取Pho指针

PPho已经实现了operator->直接返回Pho*,不需要绕路拿shared_ptr:

cdef class PyPPho:
    cdef PPho* device
    def __cinit__(self):
        self.device = NULL
    cdef assign_device(self, PPho& device_):
        self.device = &device_
    cdef get_pho(self):
        # 解引用得到PPho对象后直接调用重载的->运算符
        return (*self.device).operator->()

方案2:通过类型转换拿到shared_ptr再获取Pho指针

如果你需要同时拿到shared_ptr<Pho>对象本身,可以用PPho提供的类型转换运算符:

cdef get_pho(self):
    cdef shared_ptr[Pho] sp_ptr = <shared_ptr[Pho]>(*self.device)
    return sp_ptr.get()

注意事项

  • 如果需要把返回的Pho*封装为Python可访问的对象,需要额外实现对应PyPho包装类,将指针绑定到包装类实例,且注意不要让Pho*的生命周期超过持有它的PPho对象,避免野指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:54:02