Próbuję dowiedzieć się, jak używać std :: shared_ptr z niestandardowym deleterem. W szczególności używam go z SDL_Surface jako:Używanie niestandardowego deltera ze std :: shared_ptr
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);
który kompiluje i działa dobrze. Chciałbym jednak wypróbować mój własny deleter i nie mogę się dowiedzieć, jak to zrobić. Dokumentacja dla SDL_FreeSurface znajduje się tutaj:
http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface
w którym znajdę SDL_FreeSurface jest zadeklarowana jako:
void SDL_FreeSurface(SDL_Surface* surface);
jako test, a idąc tą informacją, próbowałem następujące funkcje:
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
jednak kompilacji z g ++ daje mi następujący błąd:
error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'
Przyjrzałem się dokumentacji GNU dla implementacji gcc std :: shared_ptr, ale nie mam z tego wiele sensu. Co ja robię źle?
EDYCJA: Od tego czasu zawęziłem problem, ale pozostawi pierwotne pytanie powyżej. Co miałam klasa Gra, która, jeśli ja rozebrać go do podstawowej implementacji, było coś takiego:
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 */
}
z realizacji DeleteSurface
jak powyżej, a realizacja CacheImages()
jak:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
w którą grę mam błąd, który wymieniłem powyżej. Jeśli jednak przestawię funkcję DeleteSurface()
poza klasę Game
, nie zmieniając jej, kod się skompiluje. Co się stało z włączeniem funkcji DeleteSurface
w klasie Game
, która powoduje problemy?
Twój przykład kompiluje się dobrze dla mnie. –