2014-04-28 27 views
5

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ì?

Trả lời

11

Đoạn bạn đang trích dẫn không áp dụng. Bạn đang một phần chuyên về mẫu lớp học (std::hash), không phải là mẫu lớp thành viên của lớp thư viện chuẩn hoặc mẫu lớp học.std::hash không phải là thành viên của bất kỳ lớp học hoặc mẫu lớp nào.

Đối với trường hợp của bạn, đoạn 1 của phần này cũng áp dụng, và cho phép chuyên môn khi có ít nhất một loại người dùng định nghĩa có liên quan (tôi nhấn mạnh):

Hành vi của một chương trình C++ là undefined nếu nó thêm các khai báo hoặc các định nghĩa vào không gian tên std hoặc vào một không gian tên trong không gian tên std trừ khi có quy định khác. Chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện chuẩn nào vào không gian tên std chỉ khi khai báo phụ thuộc vào kiểu người dùng được xác định và chuyên môn đáp ứng yêu cầu thư viện chuẩn cho mẫu ban đầu và không rõ ràng là .

+0

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

+3

@ 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

Các vấn đề liên quan