2014-11-26 2 views
0

Я предполагаю, что специализация std :: hash для общих типов указателей может использоваться для указателей между собой, однако я не могу использовать ее как таковую; вместо этого мой компилятор дает мне ошибку «неполного типа», которую я предполагаю, означает, что «не использует специализацию std :: hash для указателей? Что тут происходит?Невозможно использовать специализацию std :: hash для Pointer-to-Member?

#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 

ответ

2

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

0

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

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

Используйте его.

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

То, что «реализует класс», замаскирует сложную часть проблемы - далеко не ясно, как вычислить значение хэша для указателя на член. –

+0

@GeoffRomer, я согласен. Я не уверен, что OP знает, как реализовать класс. Я помогал объяснить ошибку компилятора и как его преодолеть. –

+0

@R Sahu, насколько я знаю, нет четкого способа взять хэш от указателя к члену. Я был просто (неправильно), полагая, что указатель на специализацию std :: hash покрыл их. – Shokwav

1

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

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

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

+0

Очень важно, чтобы я принимал хеш от указателя к члену, а не статическая функция. – Shokwav