我正在尝试使用std::shared_ptr和自定义删除器。具体来说,我正在将其与SDL_Surface一起使用,如下所示:
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);
编译和运行都没有问题。然而,我想尝试自己的删除器,但无法弄清如何操作。SDL_FreeSurface 的文档在这里:http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface。其中我发现 SDL_FreeSurface 声明为:void SDL_FreeSurface(SDL_Surface* surface);
根据这些信息,我尝试了以下函数作为测试:
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
然而,使用g++编译时我遇到了以下错误:
error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'
我查看了gcc std :: shared_ptr实现的gnu文档,但无法理解。我做错了什么吗?编辑:我已经缩小了问题范围,但仍将保留上面的原始问题。我有一个Game类,如果我将其剥离到基本实现,则是这样的:
class Game {
public:
/* various functions */
private:
void DeleteSurface(SDL_Surface* surface);
bool CacheImages();
std::vector<std::shared_ptr<SDL_Surface> > mCachedImages;
/* various member variables and other functions */
}
使用如上所示的DeleteSurface
实现,以及如下所示的CacheImages()
实现:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
我在使用游戏时遇到了上述错误。但是,如果我将DeleteSurface()
函数移出Game
类而不进行其他修改,则代码会编译通过。为什么将DeleteSurface
函数包含在Game
类中会引起问题?