Невозможно использовать специализацию std :: hash для указателя на член?

Я предполагаю, что специализация 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

0

Решение

Проблема в том, что указатели на членов на самом деле не являются указателями; они просто имеют похожее имя и похожий синтаксис. std::hash специализируется для обычных указателей, но не для указателей на членов. Вы, конечно, могли бы специализировать его самостоятельно, но если есть способ сделать это, который гарантированно безопасен, я этого не вижу; с указателем на член мало что можно сделать, кроме как разыменовать его или приводить к другим указателям на члены.

2

Другие решения

измените объявление структуры на:

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

Нестатические функции-члены имеют скрытый параметр, соответствующий указателю this, поэтому происходит компилятор.

1

Вы должны определить специализацию, прежде чем сможете ее использовать.

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

Используй это.

int main(){
std::hash<void (foo::*)(int)> hasher;
}
0
По вопросам рекламы [email protected]