Sto cercando di capire come usare std :: shared_ptr con un deleter personalizzato. Nello specifico, lo sto usando con SDL_Surface come:Utilizzo deleter personalizzato con std :: shared_ptr
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);
che compila e funziona correttamente. Tuttavia, mi piacerebbe provare il mio personale deleter e non riesco a capire come farlo. La documentazione per SDL_FreeSurface si trova qui:
http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface
in cui trovo lo SDL_FreeSurface è dichiarato come:
void SDL_FreeSurface(SDL_Surface* surface);
Come test, e andando da tali informazioni, ho provato la seguente funzione:
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
Tuttavia, la compilazione con g ++ mi dà il seguente errore:
error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'
Ho esaminato la documentazione di gnu per l'implementazione gcc std :: shared_ptr ma non posso dare molto senso a questo. Che cosa sto facendo di sbagliato?
EDIT: Ho quindi ristretto il problema, ma lascerò la domanda originale sopra. Quello che avevo era una classe di gioco che, se mi striscia verso il basso ad un'implementazione di base, era qualcosa di simile:
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 l'attuazione di DeleteSurface
come sopra, e l'implementazione di CacheImages()
come:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
che mi fa l'errore che ho elencato sopra. Tuttavia, se sposto la funzione DeleteSurface()
all'esterno della classe Game
senza alterarla in altro modo, il codice viene compilato. Di cosa si tratta includendo la funzione DeleteSurface
nella classe Game
che causa problemi?
Il tuo esempio si compila bene per me. –