Идентификатор Make_Pair не найден в одной функции, но найден в другой

Я пытаюсь создать словарь шрифтов с 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 функция от getFont, Нет проблем для make_pair в getSprite,

2

Решение

В первом примере вы вызываете 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 если вы найдете его более читабельным, но имейте в виду.

5

Другие решения

просто быть явным и заявить, что вы хотите make_pair от std Пространство имен

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

потому что в вашей второй функции компилятор не имеет возможности найти его в std поскольку в этом пространстве имен нет аргументов (тогда компилятор не выполняет поиск в этом пространстве имен для определения члена)

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

По вопросам рекламы [email protected]