Estoy tratando de encontrar la forma de usar std :: shared_ptr con un eliminador personalizado. En concreto, lo estoy usando con SDL_Surface como:Uso del eliminador personalizado con std :: shared_ptr
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);
que compila y funciona muy bien. Sin embargo, me gustaría probar mi propio eliminador y no puedo encontrar la forma de hacerlo. La documentación para SDL_FreeSurface se encuentra aquí:
http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface
en el que encuentro la SDL_FreeSurface se declara como:
void SDL_FreeSurface(SDL_Surface* surface);
Como prueba, y yendo por esa información, probé la siguiente función:
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
Sin embargo, se compila con g ++ me da el siguiente error:
error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'
He consultado la documentación de gnu para la implementación de gcc std :: shared_ptr, pero no puedo darle mucho sentido. ¿Qué estoy haciendo mal?
EDITAR: Desde entonces he reducido el problema, pero dejaré la pregunta original anterior. Lo que tenía era una clase de juego que, si se me tira hacia abajo a una implementación básica, era algo así como:
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 */
}
con la implementación de DeleteSurface
que el anterior, y la implementación de CacheImages()
como:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
que juego el error que enumeré arriba. Sin embargo, si muevo la función DeleteSurface()
fuera de la clase Game
sin alterarla de otra manera, el código se compila. ¿De qué se trata al incluir la función DeleteSurface
en la clase Game
que está causando problemas?
Su ejemplo compila bien para mí. –