C++ 98中的模板专业化

cas*_*der 0 c++ templates template-specialization c++11

在对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>
        {
        };
}
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 5

在后来的C++之前版本的GCC中,非标准的遗留hash_sethash_map实现被放置在命名空间中__gnu_cxx,而不是std.因此,该组旧版容器的默认哈希算子实际上__gnu_cxx::hash<T>并非如此std::hash<T>.而且,AFAIK不是它的一部分<functional>.

当时预先标准的新兴实现unordered_set并且unordered_map位于std::tr1命名空间中,这意味着他们的功能版本hash实际上std::tr1::hash<T>并非如此std::hash<T>.

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

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


Mik*_*our 5

问题是,std::hash使用它的无序容器在C++ 11之前不存在.如果您需要使用只能理解C++ 98的编译器,那么您就无法使用它们.

TR1和Boost提供类似的容器.