Я пытаюсь решить, как использовать 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>)'
Я просмотрел документацию gnu для реализации gcc std:: shared_ptr, но не могу ее полностью понять. Что я делаю неправильно?
EDIT: Я с тех пор сузил проблему, но оставил исходный вопрос выше. У меня был класс 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()
as:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
какая игра мне ошибка, которую я перечислил выше. Однако, если я перемещаю функцию DeleteSurface()
вне класса Game
, не изменяя ее иным образом, компиляция кода. Что такое включение функции DeleteSurface
в класс Game
, вызывающий проблемы?