2015-08-20 6 views
0

Учитывая вложенную структуру шаблонного класса, как следующее:определения хэш-функции для вложенного пользовательского типа

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' 

Я не знаю, как еще я должен выразить это, однако.

Почему это неправильно, и что я должен сделать, чтобы исправить это?

+0

Можете ли вы добавить жалобу со своего компилятора? – WorldSEnder

+0

Ну, эта конкретная ошибка говорит, что вам нужно 'typename'. – jxh

ответ

1

Вы не можете.

Зависимые типы не могут быть сопоставлены с образцом, так как в общем случае требуется инвертировать произвольный алгоритм Тьюринга.

Самый простой способ - сделать B независимым шаблоном, затем typedef в A.

Смежные вопросы