Tôi đã cố gắng tìm một trích dẫn ngắn gọn từ tiêu chuẩn, nhưng tôi không nghĩ ere là một. Thực tế là, không có điều gì như là một chuyên môn hóa một phần của một hàm mẫu (hoặc, cho rằng vấn đề, của một bí danh mẫu). Chỉ các mẫu lớp mới có thể có các chuyên môn từng phần.
Hãy quên các mẫu trong một giây. Trong C++, có một sự khác biệt lớn giữa tên lớp và tên hàm. Chỉ có một định nghĩa của một lớp trong một phạm vi nhất định. (Bạn có thể có các khai báo khác nhau, nhưng tất cả chúng đều đề cập đến một lớp thực.) Vì vậy, tên thực sự xác định lớp.
Tên chức năng, mặt khác, là một loại nhận dạng nhóm. Bạn có thể xác định bất kỳ số lượng hàm nào trong phạm vi có cùng tên chính xác. Khi bạn sử dụng tên hàm để gọi hàm, trình biên dịch phải tìm ra hàm nào bạn thực sự có nghĩa là bằng cách xem xét các khả năng khác nhau và khớp chữ ký của mỗi hàm với các đối số được cung cấp. Không có mối quan hệ giữa các chức năng khác nhau có cùng tên; họ là những thực thể hoàn toàn riêng biệt.
Vì vậy, không có vấn đề gì lớn. Bạn biết tất cả điều này, phải không? Nhưng bây giờ chúng ta hãy quay trở lại các mẫu.
Tên của một lớp templated vẫn là duy nhất.Mặc dù bạn có thể xác định các chuyên môn từng phần, bạn phải rõ ràng chuyên lớp tương tự. Cơ chế này trông bề ngoài giống như thuật toán phân giải tên hàm được đề cập ở trên, nhưng có sự khác biệt đáng kể - một trong số đó là, không giống như các nguyên mẫu hàm, bạn không thể có hai mẫu lớp trong cùng phạm vi với các kiểu tham số mẫu khác nhau.
Chức năng được mạ điện, mặt khác, không cần phải xác định tên duy nhất. Templating không thay thế cơ chế quá tải chức năng bình thường. Vì vậy, khi trình biên dịch đang cố gắng tìm ra tên hàm có nghĩa là gì, nó phải xem xét tất cả các khai báo được tạo khuôn mẫu và không có khuôn mẫu cho tên hàm đó, giải quyết các lệnh được định sẵn cho một tập các tham số mẫu (nếu có thể) và sau đó một khi nó có một danh sách các đối tượng chức năng có thể, chọn đối tượng tốt nhất với độ phân giải quá tải bình thường.
Đó là một thuật toán khá khác với độ phân giải tham số mẫu lớp mẫu. Thay vì chỉ khớp một danh sách các đối số mẫu được cung cấp với một danh sách các tham số mẫu đã khai báo, đó là cách nó giải quyết các mẫu lớp, nó phải lấy từng hàm khuôn mẫu có thể khớp nhau (ví dụ: ít nhất số tham số phù hợp) ; suy ra các tham số mẫu bằng cách hợp nhất các đối số được cung cấp với mẫu; và sau đó thêm chuyên môn giải quyết vào bộ quá tải cho một vòng tiếp theo của độ phân giải quá tải.
Tôi cho rằng có thể đã thêm độ phân giải một phần vào quá trình đó, nhưng các tương tác giữa chuyên môn từng phần và quá tải hàm tấn công tôi có khả năng dẫn đến hành vi giả huyền diệu. Trong trường hợp, nó không cần thiết và do đó không có cơ chế như vậy. (Bạn hoàn toàn có thể chuyên về một mẫu chức năng. Chuyên môn đầy đủ có nghĩa là không có đối số mẫu để suy luận, do đó, nó không phải là vấn đề.)
Vì vậy, đó là scoop: bạn không thể chuyên chức năng một phần, nhưng có không có gì ngăn cản bạn cung cấp bất kỳ số lượng mẫu chức năng nào có cùng tên. Tất cả chúng sẽ được xem xét ở độ phân giải quá tải, và cái tốt nhất sẽ thắng, như thường lệ.
Thông thường, điều đó thực sự đủ cho nhu cầu quá tải của bạn. Bạn nên suy nghĩ về các hàm templated giống như cách bạn nghĩ về các hàm bình thường: đưa ra một cách để chọn một hàm bạn muốn dựa trên các đối số được cung cấp. Nếu bạn cảm thấy bạn thực sự cần cung cấp các tham số mẫu trong một cuộc gọi hàm, thay vì để chúng được suy luận, chỉ cần làm cho hàm thành viên (có thể là tĩnh) của một lớp templated và cung cấp các đối số mẫu cho lớp đó.
Hy vọng rằng sẽ giúp ...
Hầu như trùng lặp: http://stackoverflow.com/questions/12335762/partial-specialization-of-member-function và http://stackoverflow.com/questions/165101/invalid-use-of-incomplete-type- chuyên biệt về lỗi-từng phần-mẫu. – jogojapan