5

私はこのテンプレート化されたクラスを持っています:

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でコンパイルしようとすると、悲鳴が上がります

'<' の前にイニシャライザが必要です</p>

関して

hash<Thing<T> >

宣言の一部。手がかりがあれば、頭に残っている数本の髪の毛を救うのに役立ちます.

4

1 に答える 1

7

ただの特殊化を提供することはできません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これを の 2 番目のテンプレート引数として指定すること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;
于 2013-05-08T22:34:59.743 に答える