2011-01-23 22 views
0

我有類網關。 我需要將這個類的對象存儲在一個哈希表中(使用tr1 :: unordered_set)。 我用兩個unorderd_set和另一個上下文類網關和他們的工作很好,但我不明白如何把一個網關的無序集,因爲我不能在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

`散列<類型名稱網關>()`需要`>`字符之間的空間。 C++ 0x修復了這個 – KitsuneYMG 2011-01-24 05:21:28

回答

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

語法錯誤。 typename不是必需的。

正確的語法是這樣的:

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

通知我也做了參數const Gateway<T> &類型,只是爲了避免副本!

還要注意,命名空間tr1不是一個嵌套的命名空間。