无法对指向成员的指针使用 std::hash 的特化?
Posted
技术标签:
【中文标题】无法对指向成员的指针使用 std::hash 的特化?【英文标题】:Unable to Use Specialization of std::hash for Pointer-to-Member? 【发布时间】:2014-11-26 21:44:54 【问题描述】:我假设 std::hash 对泛型指针类型的特化可用于指向成员的指针,但是我不能这样使用它;相反,我的编译器给了我一个“不完整类型”错误,我认为这意味着'没有使用 std::hash 的专门化指针?这是怎么回事?
#include <functional>
struct foo
void bar(int a)
;
int main()
std::hash<void (foo::*)(int)> hasher;
错误:
..\src\m.cpp:43:32: error: aggregate 'std::hash<void (foo::*)(int)> hasher' has incomplete type and cannot be defined
【问题讨论】:
【参考方案1】:问题是指向成员的指针并不是真正的指针;他们只是碰巧有一个相似的名字和相似的语法。 std::hash
专门用于普通指针,但不适用于指向成员的指针。您当然可以自己专门研究它,但是如果有一种方法可以保证安全,那么我看不到它;除了取消引用它或将其强制转换为指向成员的其他指针之外,您对指向成员的指针无能为力。
【讨论】:
【参考方案2】:将结构声明更改为:
struct foo
static void bar(int a)
;
非静态成员函数有一个隐藏参数对应this指针,这就是编译器发生的原因。
【讨论】:
获取成员指针的哈希值而不是静态函数是至关重要的。【参考方案3】:您必须先定义专业化才能使用它。
namespace std
template <>
struct std::hash<void (foo::*)(int)>
// Implement the class.
;
使用它。
int main()
std::hash<void (foo::*)(int)> hasher;
【讨论】:
“实现类”掩盖了问题的难点——如何计算指向成员的指针的哈希值远不清楚。 @GeoffRomer,我同意。我也不确定 OP 是否知道如何实现该类。我正在帮助解释编译器错误以及如何克服它。 @R Sahu 据我所知,没有明确定义的方法来获取指向成员的指针的哈希值。我只是(错误地)假设 std::hash 的指针特化覆盖了它们。 @Shokwav,也许这个 SO 帖子的答案可能会有所帮助。 ***.com/questions/1328238/…以上是关于无法对指向成员的指针使用 std::hash 的特化?的主要内容,如果未能解决你的问题,请参考以下文章