【问题标题】:std::hash template partial specializationstd::hash 模板部分特化
【发布时间】:2014-06-13 21:27:08
【问题描述】:

我用模板写了一些类:

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

我应该为这个类写 ::std::hash specializtion。我怎样才能做到这一点? 简单的偏特化:

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 第三版 2011-09-01

17.6.4.2.1 命名空间标准 [namespace.std]

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

我能做什么?

【问题讨论】:

    标签: c++ templates c++11 std language-lawyer


    【解决方案1】:

    您引用的段落不适用。您只专注于一个类模板 (std::hash),而不是标准库类或类模板的成员类模板。 @ 987654322@ 不是任何类或类模板的成员。

    对于您的情况,同一部分的第 1 段适用,并且在涉及至少一种用户定义类型时允许专门化(强调我的):

    如果 C++ 程序将声明或定义添加到命名空间 std 或 除非另有说明,否则命名空间 std 内的命名空间。 程序可以添加模板特化 仅当声明依赖于用户定义的类型时,任何标准库模板到命名空间 std 并且专业化满足原始模板的标准库要求并且没有明确 禁止。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多