2012-12-20 219 views
0

做完從GCC下面的錯誤代碼的簡要搜索,命中數顯示的問題,要求對這一問題的幫助,但沒有什麼具體的輪番上漲:模板專業化C++ 98

error: explicit specialization of non-template 'std::hash'

它看起來像std :: hash確實是一個模板,所以錯誤不清楚問題是什麼。下面是生成消息的示例代碼。 GCC選項-std = C++ 0x編譯代碼就好了。問題是我有一個較舊的編譯器,它在一臺機器上不支持C++ 11,所以爲什麼不編譯會有所幫助。

另一種方法可能是使用繼承而不是專門化,如果這是唯一的解決方案,那麼也很好。

#include <functional> 

struct test 
{ 
    int n; 
}; 

namespace std 
{ 
    template<> 
     struct hash<test> 
     { 
     }; 
} 
+1

你在說什麼「舊編譯器」?舊版本的GCC?或者一些完全不同的編譯器 – AnT

+0

你的問題基本上是「當我使用C++ 11的時候,當我不能使用C++ 11時,它不起作用,爲什麼?」 ...答案應該是顯而易見的 –

回答

5

問題是,std::hash和使用它的無序容器在C++ 11之前並不存在。如果您需要使用僅瞭解C++ 98的編譯器,則不能使用它們。

TR1和Boost提供類似容器。

2

std::hash僅在C++ 11中引入。因此std中沒有template <typename T> struct hash { ... };專門用於C++ 98/C++ 03。

5

在稍後的C++ 11版本的GCC中,將非標準傳統hash_sethash_map實現放置在命名空間__gnu_cxx而不是std中。因此,該組舊容器的默認散列函數實際上是__gnu_cxx::hash<T>,而不是std::hash<T>。此外,AFAIK它不是<functional>的一部分。

的當時的預標準unordered_setunordered_map新興的實現是居住在std::tr1命名空間,這意味着他們hash functior版本竟是std::tr1::hash<T>,不std::hash<T>

如果您使用的是較舊的編譯器,請確定您需要的是哪一個。

所以我猜你std恰好在<functional>聲明一些完全無關的非模板名稱hash,這是造成編譯器抱怨,當你試圖在模板上下文中使用它。

+0

''中沒有無關的名稱'hash',G ++爲未聲明的名稱提供了該錯誤。 –