如何在使用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
相关产品推荐
相关产品推荐

