Я предполагаю, что специализация 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
Проблема в том, что указатели на членов на самом деле не являются указателями; они просто имеют похожее имя и похожий синтаксис. 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;
}