我正在尝试使用SDL_ttf创建字体字典,就像我用SDL_image制作字典一样。由于字体与pnt_size
一起存储,因此我制作了包含此信息的结构:
struct fontinfo
{
string assetname;
int size;
};
两个字典都跟着:
map<string, SDL_Surface*> imageDictionary;
map<fontinfo*, TTF_Font*> fontDictionary;
两者之间的区别在于字体字典不仅需要包含文件的字符串,还需要包含字体的大小。
然后当对象请求图像或字体时,它会为其调用get
函数。现在getSprite
工作正常:
SDL_Surface* ResourceManager::getSprite(string assetname)
{
if (assetname == "")
return NULL;
map<string, SDL_Surface*>::iterator it = imageDictionary.find(assetname);
if (it != imageDictionary.end())
return it->second;
else
{
SDL_Surface* image = Load_Image(assetname);
if (image != NULL)
imageDictionary.insert(make_pair(assetname, image));
return image;
}
}
getFont
方法几乎完全相同,只是它使用fontinfo
代替string
:
TTF_Font* ResourceManager::getFont(string assetname, int size)
{
if (assetname == "" || size < 0)
return NULL;
fontinfo* info = new fontinfo();
info->assetname = assetname;
info->size = size;
map<fontinfo*, TTF_Font*>::iterator it = fontDictionary.find(info);
if (it != fontDictionary.end())
return it->second;
else
{
TTF_Font* font = Load_Font(assetname, size);
if (font != NULL)
fontDictionary.insert(make_pair(info, font));
return font;
}
}
编译器告诉我标识符未找到且 make_pair
未定义,但仅适用于make_pair
的{{1}}函数。 getFont
中的make_pair
没有问题。
答案 0 :(得分:5)
在第一个示例中,您调用make_pair
并且编译器在namespace std
中找到它,因为它的第一个参数位于该命名空间(std::string
)中。在第二个示例中,编译器无法查看namespace std
,因此您必须明确,并说出std::make_pair
。
隐式匹配功能称为ADL或Koenig查找:https://en.wikipedia.org/wiki/Argument-dependent_name_lookup
作为旁注,最好使用myMapType::value_type(foo, bar)
而不是std::make_pair(foo, bar)
作为std::map::insert
的参数。这是因为如果foo和bar的类型与地图的类型(包括const限定符)不完全匹配,则某些编译器将无法优化临时对的复制。这是一个微观优化,如果您发现它更具可读性,请随时继续使用make_pair
。
答案 1 :(得分:0)
只需明确说明您希望来自make_pair
命名空间
std
imageDictionary.insert(std::make_pair(assetname, image));
因为在你的第二个函数中,编译器无法在std
中找到它,因为此命名空间中没有参数(然后编译器不在此命名空间中进行查找以解析成员)
fontDictionary.insert(std::make_pair(info, font));