Make_Pair标识符在一个函数中找不到,但在另一个函数中找到
Make_Pair identifier not found in one function but found in another
我试图用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
是未定义的,但仅适用于getFont
的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的类型不完全匹配map的类型(包括const限定符),一些编译器将无法优化临时对的复制。可以肯定的是,这是一个微优化,所以如果你发现make_pair
更具可读性,你可以继续使用它,但要注意。
只需明确并声明您希望std
命名空间中的make_pair
imageDictionary.insert(std::make_pair(assetname, image));
因为在第二个函数中编译器没有办法在std
中找到它,因为这个命名空间没有参数(然后编译器不会在这个命名空间中查找来解析成员)
fontDictionary.insert(std::make_pair(info, font));
- 编译器找不到'aligned_alloc'函数
- 在 c++ 中找不到此函数的标识符
- LLVM 选择找不到函数传递
- 找不到 #define 的函数定义
- LD 找不到生成的函数
- C++线程找不到函数作为参数(链接器)
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- Javascript 找不到使用 emscripten 编译的导出 WASM 函数
- 给定一个 3 x 3 矩阵或任何 n x n 矩阵,为什么我的以下函数找不到对角线差异?
- QObject::连接不起作用 - 使用函数语法找不到信号
- VS 2017 C++编译器在 VS 2005 中找不到匹配函数
- 找不到如何创建使用指针、字符和 for 函数组合的程序
- 这个基于范围的'for'语句需要一个合适的函数,但找不到任何函数
- im调用函数时找不到标识符?
- 找不到使用 bitset 实例化模板函数的有效方法
- 如何修复找不到匹配的重载函数?
- ADL 找不到重载函数
- 构造函数找不到合适的定义,以及 100 个其他错误?
- 类函数找不到类定义的变量
- 平均函数找不到正确的平均c++