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)
在后来的C++之前版本的GCC中,非标准的遗留hash_set和hash_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,这导致编译器在你试图在模板上下文中使用它时会抱怨.
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |