这是我正在尝试做的事情:
//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);
}
我正在使用MSVC 2005(针对Windows CE 5.0进行编译),我收到以下错误:
错误C3867:'ImageCache :: freeImage': 函数调用缺少参数列表; 使用'&amp; ImageCache :: freeImage'来创建 指向成员的指针
我理解for_each()的函数参数需要一个静态函数(如果我将freeImage声明为static,则所有这些都有效)但我想知道如何为非静态成员函数执行此操作。我不明白隐含的“this”指针是如何传递给对freeImage()的调用的。任何帮助是极大的赞赏!我用谷歌搜索了一个小时,由于某种原因没有找到相同的情况。
我应该补充一点,我试图避免重载()运算符,因为这似乎不必要的冗长和其他类似的,但显然不可编译的方法也避免这种情况。
答案 0 :(得分:2)
如果您不想使ImageCache::freeImage
成为静态成员函数,则需要传递this
指针。如果您不想制作一个operator ()
重载的辅助类,可以使用boost::bind
为您动态创建仿函数:
for_each(imageFileMap.begin(), imageFileMap.end(),
boost::bind(&ImageCache::freeImage, this, _1, _2));
答案 1 :(得分:1)
“for_each”是一个独立的函数,它不是你的类的成员,所以它不知道传递“this”指针或使用成员函数语法调用。
在那个平台上你可能需要mem_fn(使这个指针显式)和bind1st(传递this指针)。 tr1 :: bind(以前称为boost.bind)我认为你无法使用它,但如果它是一个优秀的解决方案并且取代了bind1st等。
答案 2 :(得分:1)
不是
for_each(imageFileMap.begin(), imageFileMap.end(), freeImage);
但是
for_each(imageFileMap.begin(), imageFileMap.end(),&ImageCache::freeImage);
有问题的错误
但是你仍然会遇到问题,因为ImageCache::freeImage
是非静态的(虽然它可能是静态的)成员函数。
使freeImage保持静态,上面的更改应该有所帮助。