Я пытаюсь создать словарь шрифтов с 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
,
В первом примере вы вызываете 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
если вы найдете его более читабельным, но имейте в виду.
просто быть явным и заявить, что вы хотите make_pair
от std
Пространство имен
imageDictionary.insert(std::make_pair(assetname, image));
потому что в вашей второй функции компилятор не имеет возможности найти его в std
поскольку в этом пространстве имен нет аргументов (тогда компилятор не выполняет поиск в этом пространстве имен для определения члена)
fontDictionary.insert(std::make_pair(info, font));