嵌套的unordered_map没有名为'emplace'的成员

时间:2017-04-14 13:53:50

标签: c++ c++11

我试图通过gamedev书来解决相当难的程序。我认为它崩溃是因为作者使用Windows而我使用Linux(g ++)。简而言之,我有几个类来执行应用程序状态的逻辑,我有地图映射来保存状态及其回调:

enum class StateType {
    Intro = 1, MainMenu, Game, Paused, GameOver, Credits
};

using Bindings  = std::unordered_map<std::string, Binding*>;
using CallbackContainer = std::unordered_map<std::string, std::function<void(EventDetails*)>>;
using Callbacks = std::unordered_map<StateType, CallbackContainer>;

class EventManager {
public:
...
    template<class T>
    bool AddCallback(StateType l_state, const std::string& l_name, 
        void(T::*l_func)(EventDetails*), T* l_instance) {
        auto itr = m_callbacks.emplace(l_state, CallbackContainer()).first;
        auto temp = std::bind(l_func, l_instance, std::placeholders::_1);
        return itr->second.emplace(l_name, temp).second;
    }

private:
    Callbacks m_callbacks;

我不确定我的代码的哪些部分包含在这里。无论如何,我得到了一个可怕的堆栈跟踪:

/usr/include/c++/5/bits/hashtable_policy.h: In instantiation of ‘struct std::__detail::__is_noexcept_hash<StateType, std::hash<StateType> >’:
/usr/include/c++/5/type_traits:137:12:   required from ‘struct std::__and_<std::__is_fast_hash<std::hash<StateType> >, std::__detail::__is_noexcept_hash<StateType, std::hash<StateType> > >’
/usr/include/c++/5/type_traits:148:38:   required from ‘struct std::__not_<std::__and_<std::__is_fast_hash<std::hash<StateType> >, std::__detail::__is_noexcept_hash<StateType, std::hash<StateType> > > >’
/usr/include/c++/5/bits/unordered_map.h:100:66:   required from ‘class std::unordered_map<StateType, std::function<BaseState*()> >’
/home/xxx/Projects/mushrooom/BaseState.h:48:28:   required from here
/usr/include/c++/5/bits/hashtable_policy.h:85:34: error: no match for call to ‘(const std::hash<StateType>) (const StateType&)’
  noexcept(declval<const _Hash&>()(declval<const _Key&>()))>
...
/usr/include/c++/5/bits/unordered_map.h:649:7: error: ‘value’ is not a member of ‘std::__not_<std::__and_<std::__is_fast_hash<std::hash<StateType> >, std::__detail::__is_noexcept_hash<StateType, std::hash<StateType> > > >’
       equal_range(const key_type& __x) const
...
/home/xxx/Projects/mushrooom/EventManager.h: In member function ‘bool EventManager::AddCallback(StateType, const string&, void (T::*)(EventDetails*), T*)’:
/home/xxx/Projects/mushrooom/EventManager.h:93:32: error: ‘using Callbacks = class std::unordered_map<StateType, std::unordered_map<std::basic_string<char>, std::function<void(EventDetails*)> > > {aka class std::unordered_map<StateType, std::unordered_map<std::basic_string<char>, std::function<void(EventDetails*)> > >}’ has no member named ‘emplace’
         auto itr = m_callbacks.emplace(l_state, CallbackContainer()).first;

似乎Callbacks没有成员安置,但它是std :: unordered_map并且它有这样的方法。

g ++ - 5,linux

1 个答案:

答案 0 :(得分:3)

它与emplace无关 - 它是缺少的哈希函数!

您使用的是std :: unordered_map,换句话说就是哈希映射。如果要将对象用作键,则此对象必须提供可以计算哈希值的函数。

您现在有两个选择:

  1. 为您的类提供std :: hash的模板特化,或者将自己的类作为第三个(hasher)模板参数传递给std :: unordered_map
  2. 使用std :: map - 这是一个不需要哈希函数的树图。