std::unordered_map::find 并以 key 作为参数进行计数无法编译

std::unordered_map::find and count with key as argument fail to compile

我在为项目编译一些代码时遇到一些神秘错误。我正在使用 std::unordered_map 来存储游戏中世界的各个部分,这样多人就可以在同一区域玩而不会混淆服务器。在world_manager.hpp中,我有一个关键结构: <pre> 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'的函数来测试一个块是否已经存在于地图中。这是错误开始的地方。 <pre> 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: In function ‘bool
world::chunk_is_loaded(world::chunk_key*)’:
world_manager.cpp:8:34: error: no matching function for call to
‘std::unordered_map world::chunk_key_hasher>::count(world::chunk_key*&)’
if(chunk_buffer.count(key) != 0)
^
world_manager.cpp:8:34: note: candidate is:
In file included from /usr/include/c++/4.8/unordered_map:48:0,
from world_manager.hpp:7,
from world_manager.cpp:1:
/usr/include/c++/4.8/bits/unordered_map.h:560:7: note:
std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type
std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::count(const
key_type&) const [with _Key = world::chunk_key; _Tp = chunk*; _Hash =
world::chunk_key_hasher; _Pred = std::equal_to;
_Alloc = std::allocator >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type = long
unsigned int; std::unordered_map<_Key, _Tp, _Hash, _Pred,
_Alloc>::key_type = world::chunk_key]
count(const key_type& __x) const
^
/usr/include/c++/4.8/bits/unordered_map.h:560:7: note: no known
conversion for argument 1 from ‘world::chunk_key*’ to ‘const key_type& {aka const world::chunk_key&}’

我不明白这个错误,当我按值传递密钥时,它给了我更长的错误字符串,甚至更加神秘。感谢任何帮助。

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 的情况下,与在映射中存储指针相比,这无疑效率较低。