tôi đã viết một số lớp với mẫu:std :: băm mẫu phần chuyên môn hóa
template <class T, class Allocator = ::std::allocator<T> >
class my_list;
tôi nên viết :: specializtion std :: băm cho lớp này. Làm thế nào tôi có thể làm điều đó? Simple chuyên môn hóa từng phần:
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 ...;
}
};
}
Nhưng tôi không thể viết chuyên môn hóa một phần đơn giản, bởi vì nó bị cấm bởi C++ ISO:
ISO/IEC 14882 phiên bản thứ ba 2011-09-01
17.6.4.2.1 Không gian tên std [namespace.std]
2 Hành vi của chương trình C++ không xác định nếu nó khai báo ... một chuyên môn rõ ràng hoặc một phần của bất kỳ mẫu lớp thành viên nào của một lớp thư viện chuẩn hoặc mẫu lớp.
Tôi có thể làm gì?
Tôi nhớ rằng người dùng C++ không thể xác định chuyên môn từng phần cho ":: std :: swap (T &, T &)". Anh ta nên định nghĩa hàm hoán đổi mới tại không gian tên với class "template class T;". Tôi nghĩ đây là tình huống tương tự. –
user3098730
@ user3098730 'std :: swap' là mẫu * chức năng *, không phải mẫu * *. Các mẫu chức năng không thể được chuyên môn hóa một phần nào cả; điều này tuân theo các quy tắc của ngôn ngữ và không liên quan gì đến 'std'. – Angew