C++ C+中的模板专门化+;98
在对GCC中的以下错误代码进行了简短搜索后,许多点击显示了对此问题寻求帮助的问题,但没有找到任何具体的结果: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
错误:非模板“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++为未声明的名称给出了该错误。