Usar el eliminador personalizado con std :: shared_ptr

Estoy tratando de averiguar cómo usar std :: shared_ptr con un eliminador personalizado. Específicamente, lo estoy usando con SDL_Surface como:

std::shared_ptr(SDL_LoadBMP(....),SDL_FreeSurface); 

que comstack y funciona 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 que SDL_FreeSurface se declara como:

 void SDL_FreeSurface(SDL_Surface* surface); 

Como prueba, y siguiendo esa información, probé la siguiente función:

 void DeleteSurface(SDL_Surface* surface) { std::cout << "Deleting surface\n"; SDL_FreeSurface(surface); } 

Sin embargo, comstackr con g ++ me da el siguiente error:

 error: no matching function for call to 'std::shared_ptr::shared_ptr(SDL_Surface*, )' 

He revisado 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 lo despojara de 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 > mCachedImages; /* various member variables and other functions */ } 

con la implementación de DeleteSurface como se DeleteSurface anteriormente, y la implementación de CacheImages() como:

 bool CacheImages() { mCachedImages.push_back(std::shared_ptr(SDL_LoadBMP(...),DeleteSurface); return true; } 

que me 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 comstack. ¿De qué se trata al incluir la función DeleteSurface en la clase Game que está causando problemas?

 std::shared_ptr(SDL_LoadBMP(....), [=](SDL_Surface* surface) { std::cout << "Deleting surface\n"; SDL_FreeSurface(surface); }); 

o

 void DeleteSurface(SDL_Surface* surface) { std::cout << "Deleting surface\n"; SDL_FreeSurface(surface); } std::shared_ptr(SDL_LoadBMP(....), DeleteSurface); 

EDITAR:

Al ver su pregunta actualizada, DeleteSurface debe ser una función que no sea miembro, de lo contrario deberá usar std::bind o std::mem_fn o algún otro adaptador de puntero de función miembro.

Este código proporciona un ejemplo de construcción de un puntero compartido con el eliminador como método de objeto. std::bind instrucción std::bind a usar.

El ejemplo es un reciclador de objetos simple. Cuando se destruye la última referencia al objeto, el objeto se devuelve al grupo de objetos libres dentro del reciclador.

El reciclador se puede cambiar fácilmente en un caché de objetos al agregar una clave a los métodos get() y add() y al almacenar los objetos en un std::map .

 class ObjRecycler { private: std::vector freeObjPool; public: ~ObjRecycler() { for (auto o: freeObjPool) delete o; } void add(Obj *o) { if (o) freeObjPool.push_back(o); } std::shared_ptr get() { Obj* o; if (freeObjPool.empty()) o = new Obj(); else { o = freeObjPool.back(); freeObjPool.pop_back(); } return std::shared_ptr(o, std::bind(&ObjRecycler::add, this, std::placeholders::_1)); } }