У меня есть этот шаблонный класс:
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> >
часть декларации. Любые подсказки помогут спасти несколько оставшихся волос на моей голове.
Вы не можете предоставить специализацию только для 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;
Других решений пока нет …