gpt4 book ai didi

c++ - Make_Pair 标识符在一个函数中未找到但在另一个函数中找到

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:22 26 4
gpt4 key购买 nike

我正在尝试用 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 函数获取字体getSprite 中的make_pair 没有问题。

最佳答案

在第一个示例中,您调用了 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,但请注意。

关于c++ - Make_Pair 标识符在一个函数中未找到但在另一个函数中找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16269492/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com