Voici ce que je suis en train de faire:Comment créer un élégant for_each() en C++ dans une fonction membre où la fonction d'exploitation est une autre fonction membre de la même classe?
//ImageCache.h:
#include <map>
#include <SDL.h>
typedef pair<const wchar_t*, SDL_Surface*> ImageNameAndSurface;
class ImageCache {
// Functions
public:
ImageCache();
~ImageCache();
SDL_Surface* getImage(const wchar_t* imageFilename);
// Variables
private:
map<const wchar_t*, SDL_Surface*> imageFileMap;
void freeImage(const pair<const wchar_t*, SDL_Surface*>& pr); //function for_each() is to operate on
};
//ImageCache.cpp:
#include "ImageCache.h"
#include <algorithm>
#include <SDL_image.h>
ImageCache::ImageCache() {}
void ImageCache::freeImage(const pair<const wchar_t*, SDL_Surface*>& pr)
{
wcout << "Freeing " << pr.first << endl;
SDL_FreeSurface(pr.second);
}
ImageCache::~ImageCache() {
for_each(imageFileMap.begin(), imageFileMap.end(), freeImage);
}
J'utilise MSVC 2005 (compilation pour Windows CE 5.0) et je reçois l'erreur suivante:
error C3867: 'ImageCache::freeImage': function call missing argument list; use '&ImageCache::freeImage' to create a pointer to member
Je comprends que le L'argument function de for_each() attend une fonction statique (et tout ceci fonctionne si je déclare freeImage comme statique) mais je voudrais savoir comment le faire pour les fonctions membres non statiques. Je ne comprends pas comment le pointeur "this" implicite n'est pas passé à l'appel à freeImage(). Toute aide est grandement appréciée! Je ai googlé pendant une heure et n'ai pas trouvé tout à fait la même situation pour une raison quelconque.
Je dois ajouter que j'essaie d'éviter de surcharger l'opérateur() car cela semble inutilement prolixe et d'autres semblables, mais évidemment les méthodes non compilables l'évitent également.
Assurez-vous d'ajouter des #includes afin de compiler votre exemple de code. –
pensez à utiliser boost, il vous manque beaucoup, vous ne http://www.boost.org/doc/libs/1_39_0/doc/html/foreach.html. – Anycorn
@aaa: même si 'BOOST_FOREACH' a ses propres limites, comme si c'était une macro ... –