Tôi đang cố gắng tìm ra cách sử dụng std :: shared_ptr với một deleter tùy chỉnh. Cụ thể, tôi đang sử dụng nó với SDL_Surface là:Sử dụng deleter tùy chỉnh với std :: shared_ptr
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);
biên dịch và chạy tốt. Tuy nhiên, tôi muốn thử những người yêu thích của riêng tôi và không thể tìm ra cách để làm như vậy. Các tài liệu cho SDL_FreeSurface được tìm thấy ở đây:
http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface
trong đó tôi tìm ra SDL_FreeSurface được khai báo là:
void SDL_FreeSurface(SDL_Surface* surface);
Là một thử nghiệm, và đi bằng thông tin rằng, tôi đã thử chức năng sau:
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
Tuy nhiên, biên soạn với g ++ mang lại cho tôi những lỗi sau:
error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'
Tôi đã xem tài liệu về gnu cho gcc std :: shared_ptr implementation nhưng không thể hiểu nhiều về nó. Tôi đang làm gì sai?
EDIT: Tôi đã thu hẹp vấn đề, nhưng sẽ để nguyên câu hỏi gốc ở trên. Những gì tôi đã có được một lớp học trò chơi mà, nếu tôi lột nó xuống đến một thực hiện cơ bản, là một cái gì đó như:
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 */
}
với việc thực hiện DeleteSurface
như trên, và thực hiện các CacheImages()
như:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
làm tôi bị lỗi khi liệt kê ở trên. Tuy nhiên, nếu tôi di chuyển hàm DeleteSurface()
bên ngoài lớp Game
mà không thay đổi nó, thì mã sẽ biên dịch. Điều gì về việc bao gồm hàm DeleteSurface
trong lớp Game
gây ra sự cố?
Ví dụ của bạn biên soạn tốt cho tôi. –