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>)'
gcc std :: shared_ptr実装のgnuドキュメントを見てきましたが、あまり意味がありません。私は何が間違っているのですか?
編集:それ以来、問題を絞り込みましたが、元の質問は上に残しておきます。私が持っていたのはゲームクラスでした。これを基本的な実装に分解すると、次のようになります。
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()
します。
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
上記のエラーを私に教えてください。ただし、DeleteSurface()
関数を変更せずにクラスの外に移動するGame
と、コードがコンパイルされます。問題を引き起こしているクラスにDeleteSurface
関数を含めることについてはどうですか?Game