2011-01-23 10 views
0

私はクラスGatewayを持っています。 このクラスのオブジェクトをハッシュテーブルに格納する必要があります(tr1 :: unordered_setを使用)。 私はunorderd_setとクラスGatewayの両方を別のコンテキストで使いましたが、うまくいきましたが、tr1の名前空間でhash関数を定義することができないため、順序付けられていないセットにゲートウェイを配置する方法を理解できません。テンプレートクラスのtr1でハッシュを定義しています

私が試した:(および他の多くの亜種)

namespace std { 
    namespace tr1 { 
     template<> <typename T> inline size_t hash<(typename Gateway<T>)>::operator()(Gateway<T> gT) const { 
      return gT.getCore()->hash(); //!DOESN't WORK 
    } 
} 

コンパイラは、この(typename Gateway<T>)が間違っていると言います。 ()をオフにすると、hash<typename Gateway<T>>()の末尾にある>>が出力ストリームとみなされます。

過去に私は誰もが問題にいくつかの光を当てることができ、この

namespace std { 
    namespace tr1 { 
     template<> inline size_t hash<Board>::operator()(Board b) const { 
      return b.hash();   //!WORKS FINE 
     } 
    } 
} 

をやっている間?答えを

更新

おかげで、まだ、まだ、コンパイラが不完全な型の無効な使用struct std::tr1::hash<>我々はその完全な定義せずにクラスを使用すると、エラーこの種の問題が発生した

、まだ言う問題がありますクラスは宣言の前に完全に定義されています。私は既に問題なく非常によく似た方法でテンプレートなしでこれを使用しました。

+0

'hash >()'>文字の間にスペースが必要です。 C++ 0xはこれを修正します – KitsuneYMG

+0

私はhttp://en.cppreference.com/w/cpp/utility/hashの例に従って同様の問題を抱えていました;) –

答えて

2
template <typename T> 
inline size_t hash<(typename Gateway<T>)>::operator()(Gateway<T> gT) const 

誤った構文です。 typenameは必須ではありません。

正しい構文はこれです:私もちょうどコピーを避けるために、パラメータconst Gateway<T> &種類を作っ

namespace tr1 
{ 
    template <typename T> 
    inline size_t hash<Gateway<T> >::operator()(const Gateway<T> & gT) const 
    { 
      return gT.getCore()->hash();   
    } 
} 

お知らせ!

また、ネームスペースtr1はネストされたネームスペースではありません。

関連する問題