C++ C+中的模板专门化+;98

C++ C+中的模板专门化+;98,c++,templates,c++11,template-specialization,C++,Templates,C++11,Template Specialization,在对GCC中的以下错误代码进行了简短搜索后,许多点击显示了对此问题寻求帮助的问题,但没有找到任何具体的结果: 错误:非模板“std::hash”的显式专门化 看起来std::hash确实是一个模板,所以错误并不清楚是什么问题。下面是生成消息的示例代码。GCC选项-std=c++0x可以很好地编译代码。问题是,我有一个旧的编译器,它在一台机器上不支持C++11,所以澄清一下为什么它不编译会很有用 另一种选择可能是使用继承而不是专门化,如果这是唯一的解决方案,那么也很高兴知道这一点 #include

在对GCC中的以下错误代码进行了简短搜索后,许多点击显示了对此问题寻求帮助的问题,但没有找到任何具体的结果:

错误:非模板“std::hash”的显式专门化

看起来std::hash确实是一个模板,所以错误并不清楚是什么问题。下面是生成消息的示例代码。GCC选项-std=c++0x可以很好地编译代码。问题是,我有一个旧的编译器,它在一台机器上不支持C++11,所以澄清一下为什么它不编译会很有用

另一种选择可能是使用继承而不是专门化,如果这是唯一的解决方案,那么也很高兴知道这一点

#include <functional>

struct test
{
    int n;
};

namespace std
{
    template<>
        struct hash<test>
        {
        };
}
#包括
结构测试
{
int n;
};
名称空间标准
{
模板
结构散列
{
};
}

std::hash
仅在C++11中引入。因此没有
模板结构哈希{…}
std
中专门研究C++98/C++03。

在以后的前C++11版本的GCC中,非标准的遗留
哈希集和
哈希映射
实现被放置在命名空间
\u gnu cxx
中,而不是
std
。因此,这组遗留容器的默认哈希函子实际上是
\uu gnu\ucxx::hash
,而不是
std::hash
。此外,它不是
的一部分

当时的预标准
unordered_set
unordered_map
的新兴实现驻留在
std::tr1
命名空间中,这意味着它们的
hash
函数版本实际上是
std::tr1::hash
,而不是
std::hash

如果您使用的是较旧的编译器,请决定您需要哪一个


因此,我猜您的
std
恰好在
中声明了一些完全不相关的非模板名称
hash
,当您尝试在模板上下文中使用它时,这会导致编译器抱怨。

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


TR1和Boost中也有类似的容器。

您在说什么“旧编译器”?GCC的旧版本?或者一些完全不同的编译器?你的问题基本上是“当我使用C++11时它工作,当我不能使用C++11时它不工作,为什么?”。。。答案应该是显而易见的,因为在
中没有不相关的名称
散列
,G++为未声明的名称给出了该错误。