I wrote some class with template:
template <class T, class Allocator = ::std::allocator<T> >
class my_list;
I should write ::std::hash specializtion for this class. How can I do that? Simple partial specialization:
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 ...;
}
};
}
But I can't write simple partial specialization, because it forbidden by C++ ISO:
ISO/IEC 14882 Third edition 2011-09-01
17.6.4.2.1 Namespace std [namespace.std]
2 The behavior of a C++ program is undefined if it declares ... an explicit or partial specialization of any member class template of a standard library class or class template.
What can I do?
The paragraph you're quoting does not apply. You're partialy specialising a class template (std::hash
), not a member class template of a standard library class or class template. std::hash
is not a member of any class or class template.
For your case, paragraph 1 of the same section applies, and that allows specialisation when at least one user-defined type is involved (emphasis mine):
The behavior of a C++ program is undefined if it adds declarations or definitions to namespace
std
or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespacestd
only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With