无法对指向成员使用 std::hash 的专用化

Unable to Use Specialization of std::hash for Pointer-to-Member?

本文关键字:std hash 专用 成员      更新时间:2023-10-16

我假设std::hash对通用指针类型的专用化可以用于指向成员的指针,但是我不能这样使用它;相反,我的编译器给了我一个"不完整的类型"错误,我认为这意味着'不使用std::hash的专用化来表示指针?这是怎么回事?

#include <functional>
struct foo{
    void bar(int a){}
};
int main(){
    std::hash<void (foo::*)(int)> hasher;
}

错误:

..srcm.cpp:43:32: error: aggregate 'std::hash<void (foo::*)(int)> hasher' has incomplete type and cannot be defined

问题是指向成员的指针并不是真正的指针;它们只是碰巧具有相似的名称和相似的语法。 std::hash专门用于普通指针,但不用于指向成员的指针。你当然可以自己专门化它,但如果有一种方法可以保证安全,我看不到它;除了取消引用它或将其强制转换为指向成员的其他指针之外,您无法对指向成员的指针执行太多操作。

结构声明更改为:

struct foo{
    static void bar(int a){}
};

非静态成员函数有一个与 this 指针对应的隐藏参数,这就是编译器发生的原因。

您必须先定义专用化,然后才能使用它。

namespace std
{
   template <>
   struct std::hash<void (foo::*)(int)>
   {
       // Implement the class.
   };
}

使用它。

int main(){
    std::hash<void (foo::*)(int)> hasher;
}