无法对指向成员的指针使用 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 的特化?的主要内容,如果未能解决你的问题,请参考以下文章