std::hash模板部分特化

9

我写了一些模板类:

 template <class T, class Allocator = ::std::allocator<T> >
 class my_list;

我应该为这个类编写::std::hash特化。我该怎么做? 简单的部分特化:
namespace std {
  template <class T, class Allocator>
      class hash<my_list<T, Allocator> >{
      public :
      size_t operator()(const my_list<T, Allocator> &x ) const{
          return ...;
      }
  };
}

但是我无法编写简单的部分特化,因为它被C++ ISO禁止:

ISO/IEC 14882 Third edition 2011-09-01

17.6.4.2.1 命名空间std [namespace.std]

2 如果一个C++程序声明...标准库类或类模板的任何成员类模板的显式或部分特化,其行为是未定义的。

我该怎么办?

1个回答

14
你引用的段落不适用于你的情况。你正在部分地特化一个类模板(`std::hash`),而不是标准库类或类模板的成员类模板。`std::hash` 不是任何类或类模板的成员。
对于你的情况,同一节的第1段适用,并且当涉及至少一个用户定义类型时允许特化(我强调):
“如果 C++ 程序将声明或定义添加到 namespace std 或 namespace 中的某个命名空间中,除非另有规定,否则其行为未定义。 仅当声明依赖于用户定义的类型并且特化满足原始模板的标准库要求且未被明确禁止时,程序才能向 namespace std 添加任何标准库模板的模板特化。”

2
我记得C++用户无法为"::std::swap(T<A,B>&, T<A,B>&)"定义部分特化。他应该在具有"class template <class A, class B> class T;"的命名空间中定义新的交换函数。我认为这是相同的情况。 - user3098730
5
std::swap 是一个函数模板,不是类模板。函数模板不能进行部分特化;这是语言规则所决定的,与 std 无关。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接