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 的情况下,与在映射中存储指针相比,这无疑效率较低。
我在为项目编译一些代码时遇到一些神秘错误。我正在使用 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 的情况下,与在映射中存储指针相比,这无疑效率较低。