2012-12-20 59 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 ++为未声明的名称提供了该错误。 –