std :: unordered_map ::使用key查找和计数参数无法编译

时间:2015-07-05 03:14:13

标签: c++ c++11 stl unordered-map

在编译项目的某些代码时,我遇到了一些神秘的错误。我正在使用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;}'

我不明白错误,当我按值传递密钥时,它给了我更长的错误串甚至更加神秘。任何帮助表示赞赏。

1 个答案:

答案 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的考虑。