所以我有一个此类,该类应该允许任何其他类在发生事件时链接要调用的成员函数(即,一个类可以将一个函数链接到箭头键,而另一个函数链接到空格键) ),而我正尝试使用地图来做到这一点,就像这样:
std::unordered_map<SDL_Event, std::vector<void(*)(void)>> Callbacks;
但是这会导致此错误:
C2280 'std::hash<_Kty>::hash(const std::hash<_Kty> &)': attempting to reference a deleted function
其他错误信息无济于事,因为它指向unordered_map的定义中的空白函数(第132行):
unordered_map()
: _Mybase(key_compare(), allocator_type())
{ // construct empty map from defaults
}
据我所能理解的问题是,出于某种原因,unordered_map试图在空函数指针上执行哈希操作,并且出于显而易见的原因而失败。
我完全可以解决该问题,而不用编写自己的地图版本,而我不愿意这样做。
答案 0 :(得分:1)
为了将SDL_Event用作std :: map(已排序)的键类型,您应该提供自定义的“小于”函数,该函数说明如何对两个SDL_Event进行排序。
为了将SDL_Event用作std :: unordered_map的键类型,您应该提供自定义的“等于”函数,该函数说明如何区分两个SDL_Event,并且应该提供自定义的哈希函数,该函数告诉如何从中计算哈希值一个SDL_Event,此哈希值应等于两个相等的SDL_Event(根据您的equal函数相等),您可以使用std :: hash应用于并组合到SDL_Event结构的某些字段中。
对SDL_Event使用小于运算符的映射的更简单方法:
#include <map>
#include <vector>
#include <SDL/SDL_events.h>
using namespace std;
inline bool operator<(const SDL_KeyboardEvent& lhs,
const SDL_KeyboardEvent& rhs)
{
return lhs.keysym.sym < rhs.keysym.sym;
}
inline bool is_keyevent(const SDL_Event& ev)
{
return ev.type == SDL_KEYDOWN || ev.type == SDL_KEYUP;
}
inline bool operator<(const SDL_Event& lhs, const SDL_Event& rhs)
{
return lhs.type < rhs.type ||
lhs.type == rhs.type && is_keyevent(lhs) && lhs.key < rhs.key;
}
map<SDL_Event, vector<void(*)(void)>> Callbacks;
请注意,本例中的less运算符为KEYDOWN和KEYUP提供了两个不同的条目。
答案 1 :(得分:0)
该类应该允许任何其他类在事件发生时链接其成员函数以供调用
除了事件类型之外,SDL_Event
还包含许多您不需要的信息,例如事件发生的时间的时间戳。
由于唯一需要的是事件类型,因此应使用SDL_EventType
枚举作为键:
std::unordered_map<SDL_EventType, std::vector<void(*)(void)>> Callbacks;
由于它是一个简单的枚举,因此不需要为其定义自定义比较器。