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

如何在使用shared_ptr时调用renderer类的SDL_Renderer转换运算符?

问题分析与解决方案

核心问题在于SDL_CreateTextureFromSurface的第一个参数要求非const的SDL_Renderer*,而你的renderer类转换运算符返回的是const SDL_Renderer*——C++不允许const指针隐式转换为非const指针,这才是调用失败的关键,和shared_ptr的使用本身关系不大。

以下是几种可行的解决方式:

方式1:调整转换运算符的返回类型

如果你的设计允许对外暴露可修改的渲染器指针,可以把转换运算符的返回类型改为非const:

class renderer {
public:
  // ... 其他成员 ...
  operator SDL_Renderer*() const; // 去掉返回值的const
};

之后直接用*r即可触发转换:

SDL_CreateTextureFromSurface(*r, surface);

方式2:添加显式的成员函数(推荐)

为了避免隐式转换带来的意外,更推荐给renderer类加一个明确的成员函数来获取指针:

class renderer {
public:
  // ... 其他成员 ...
  SDL_Renderer* get_renderer() const {
    // 这里返回_renderer_ptr指向的SDL_Renderer*,注意去除const限定
    return static_cast<SDL_Renderer*>(_renderer.get()); // 假设renderer_ptr是智能指针类型
  }
};

调用时直接通过shared_ptr的箭头运算符访问:

SDL_CreateTextureFromSurface(r->get_renderer(), surface);

方式3:const_cast强制转换(不推荐)

如果你能确定SDL_CreateTextureFromSurface不会实际修改SDL_Renderer对象,可以用const_cast强制转换,但这种方式存在安全风险,仅在明确场景下使用:

SDL_CreateTextureFromSurface(
  const_cast<SDL_Renderer*>(static_cast<const SDL_Renderer*>(*r)),
  surface
);

补充:之前尝试失败的原因

  • r.get()得到的是renderer*,对其解引用后是renderer&,虽然能触发const转换运算符得到const SDL_Renderer*,但依然无法匹配函数要求的非const指针。
  • *r得到的是const renderer&,触发转换运算符后得到const SDL_Renderer*,同样因为const限定无法传入函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:42:27