在编译项目的某些代码时,我遇到了一些神秘的错误。我正在使用std::unordered_map
在游戏中存储世界各地,这样多人就可以在同一区域玩游戏而不会混淆服务器。在world_manager.hpp中,我有一个关键结构:
struct chunk_key {
int32_t cX, cZ;
uint8_t dimension;
};
无序地图:
std::unordered_map<chunk_key, class chunk*, chunk_key_hasher> chunk_buffer;
在world_manager.cpp中,我有一个名为'chunk_is_loaded'的函数来测试一个块是否已存在于地图中。这是错误开始的地方。
bool chunk_is_loaded(chunk_key* key)
{
if(chunk_buffer.count(key) != 0)
{
return true;
}
else
{
return false;
}
}
错误发生在'chunk_buffer.count(key)',其中GCC给出以下错误:
world_manager.cpp:在函数'bool
world :: chunk_is_loaded(world :: chunk_key *)'中:
world_manager.cpp:8:34:错误:没有匹配函数来调用
'std :: unordered_map world :: chunk_key_hasher&gt; :: count(world :: chunk_key *&amp;)'
if(chunk_buffer.count(key)!= 0)
^
world_manager.cpp:8:34:注意:候选人是:
在/usr/include/c++/4.8/unordered_map:48:0中包含的文件中,
来自world_manager.hpp:7,
来自world_manager.cpp:1:
/usr/include/c++/4.8/bits/unordered_map.h:560:7:注意:
std :: unordered_map&lt; _Key,_Tp,_Hash,_Pred,_Alloc&gt; :: size_type
std :: unordered_map&lt; _Key,_Tp,_Hash,_Pred,_Alloc&gt; :: count(const
key_type&amp;)const [with _Key = world :: chunk_key; _Tp = chunk *; _Hash =
world :: chunk_key_hasher; _Pred = std :: equal_to;
_Alloc = std :: allocator&gt ;; std :: unordered_map&lt; _Key,_Tp,_Hash,_Pred,_Alloc&gt; :: size_type = long
unsigned int; std :: unordered_map&lt; _Key,_Tp,_Hash,_Pred,
_Alloc&gt; :: key_type = world :: chunk_key]
count(const key_type&amp; __x)const
^
/usr/include/c++/4.8/bits/unordered_map.h:560:7:注意:没有已知的转换参数1从'world :: chunk_key *'到'const key_type&amp; {aka const world :: chunk_key&amp;}'
我不明白错误,当我按值传递密钥时,它给了我更长的错误串甚至更加神秘。任何帮助表示赞赏。
答案 0 :(得分:0)
std::unordered_map<chunk_key, class chunk*, chunk_key_hasher> chunk_buffer
地图的键是“chunk_key”类型而不是“chunk_key *”。
我想你的意图不是将chunk_key存储为对象,而是将其作为指针存储。
如果是,请更新地图声明。您还必须确保chunk_key_hasher()了解chunk_key *。
否则,你应该做
if(chunk_buffer.count(*key) != 0) // dereference key
但是,大多数情况下,与在地图中存储指针相比,这样做效率较低,没有c ++ 11的考虑。