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

C++,成员函数返回对包含指向 const 对象的指针的向量的 const 引用

无法在类的析构函数中删除指向数组的成员指针

const 指向成员的指针是不是默认指向 int?

为啥指向成员函数的指针不像数据指针那样只是内存地址

如何获得指向类的复制构造函数的成员函数指针?

通过指向派生类的指针访问派生成员变量