шаблоны — C ++ std :: tr1 :: hash для шаблонного класса

У меня есть этот шаблонный класс:

template <typename T> Thing { ... };

и я хотел бы использовать его в unordered_set:

template <typename T> class Bozo {
typedef unordered_set<Thing<T> > things_type;
things_type things;
...
};

Теперь у класса Thing есть все, что нужно, кроме хеш-функции. Я хотел бы сделать это универсальным, поэтому я пытаюсь что-то вроде:

namespace std { namespace tr1 {
template <typename T> size_t hash<Thing<T> >::operator()(const Thing<T> &t) const { ... }
}}

Попытки скомпилировать это с g ++ 4.7 кричат

ожидаемый инициализатор до ‘<»

о

hash<Thing<T> >

часть декларации. Любые подсказки помогут спасти несколько оставшихся волос на моей голове.

4

Решение

Вы не можете предоставить специализацию только для hash::operator()(const T&); просто специализировать весь struct hash,

template<typename T>
struct Thing {};

namespace std { namespace tr1 {
template<typename T>
struct hash<Thing<T>>
{
size_t operator()( Thing<T> const& )
{
return 42;
}
};
}}

Другой способ сделать это — создать хеш для Thingи укажите это как второй аргумент шаблона для unordered_set,

template<typename T>
struct Thing_hasher
{
size_t operator()( Thing<T>& const )
{
return 42;
}
};

typedef std::unordered_set<Thing<T>, Thing_hasher<T>> things_type;
6

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

Других решений пока нет …

По вопросам рекламы [email protected]