0

我假设 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
4

3 回答 3

2

问题是指向成员的指针并不是真正的指针。他们只是碰巧有一个相似的名字和相似的语法。std::hash专门用于普通指针,但不适用于指向成员的指针。您当然可以自己专门研究它,但是如果有一种方法可以保证安全,我看不到它;除了取消引用它或将其转换为指向成员的其他指针之外,您对指向成员的指针无能为力。

于 2014-11-26T22:28:55.223 回答
1

将结构声明更改为:

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

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

于 2014-11-26T22:41:51.197 回答
0

您必须先定义专业化才能使用它。

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

用它。

int main(){
    std::hash<void (foo::*)(int)> hasher;
}
于 2014-11-26T22:05:31.007 回答