0

对来自 GCC 的以下错误代码进行了简短的搜索后,一些点击显示了针对此问题寻求帮助的问题,但没有发现任何具体的问题:

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>
        {
        };
}
4

3 回答 3

6

问题是std::hash,以及使用它的无序容器在 C++11 之前并不存在。如果你需要使用只懂 C++98 的编译器,那么你就不能使用它们。

TR1 和 Boost 中提供了类似的容器。

于 2012-12-20T02:08:34.133 回答
5

在后来的 C++11 之前的 GCC 版本中,非标准遗留hash_sethash_map实现被放置在 namespace__gnu_cxx中,而不是std. 因此,该组遗留容器的默认散列函子实际上是__gnu_cxx::hash<T>,不是std::hash<T>。此外,AFAIK 它不是<functional>.

unordered_setthen-pre-standard的新兴实现unordered_map驻留在std::tr1命名空间中,这意味着他们的hashfunctior 版本实际上是std::tr1::hash<T>,而不是std::hash<T>

如果您使用的是较旧的编译器,请确定您需要的任何一个。

所以我猜你std只是碰巧在<functional>一些完全不相关的非模板名称中声明hash,这会导致编译器在你尝试在模板上下文中使用它时抱怨。

于 2012-12-20T02:07:55.593 回答
2

std::hash仅在 C++11 中引入。template <typename T> struct hash { ... };因此,没有std必要专门研究 C++98/C++03。

于 2012-12-20T02:07:04.950 回答