Make_Pair标识符在一个函数中找不到,但在另一个函数中找到

Make_Pair identifier not found in one function but found in another

本文关键字:函数 找不到 另一个 标识符 Pair Make 一个      更新时间:2023-10-16

我试图用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是未定义的,但仅适用于getFontmake_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的类型不完全匹配map的类型(包括const限定符),一些编译器将无法优化临时对的复制。可以肯定的是,这是一个微优化,所以如果你发现make_pair更具可读性,你可以继续使用它,但要注意。

只需明确并声明您希望std命名空间中的make_pair

imageDictionary.insert(std::make_pair(assetname, image));

因为在第二个函数中编译器没有办法在std中找到它,因为这个命名空间没有参数(然后编译器不会在这个命名空间中查找来解析成员)

fontDictionary.insert(std::make_pair(info, font));