Учитывая вложенную структуру шаблонного класса, как следующее:определения хэш-функции для вложенного пользовательского типа
template<class T> class A
{
...
public:
...
class B;
};
Я желающих функцию станд :: хэш работать на вложенном классе, так что его можно положить в вещах как unsorted_map и unsorted_set, поэтому я определил вложенный класс, как:
template<class T> class A<T>::B
{
public:
bool operator==(const A<T>::B &) const;
...
friend struct std::hash<A<T>::B>;
};
а потом попытался добавить специализированный станд :: хэш-структуру для этого типа следующим образом:
namespace std
{
template<class T> struct hash<A<T>::B>
{
bool operator()(const A<T>::B &x) const
{
...
}
};
}
Но компилятор жалобно жалуется, когда я пытаюсь определить пользовательский объект std :: hash function like this.
Сообщение об ошибке я получаю бесполезна, следующим образом:
xyz.cc:17:38: error: type/value mismatch at argument 1 in template parameter list for 'template<class _Tp> struct std::hash'
template<class T> struct hash<A<T>::B>
^
xyz.cc:17:38: error: expected a type, got 'A<T>::B'
Я не знаю, как еще я должен выразить это, однако.
Почему это неправильно, и что я должен сделать, чтобы исправить это?
Можете ли вы добавить жалобу со своего компилятора? – WorldSEnder
Ну, эта конкретная ошибка говорит, что вам нужно 'typename'. – jxh
Я пробовал 'struct hash ::B>' и 'struct hash :: B>', которые оба дают ошибку 'template argument 1 is invalid', и' struct hash :: B> 'дает ошибку« параметры шаблона, не используемые в частичной специализации ». –
markt1964