Tôi nghĩ rằng bạn muốn mẫu thứ hai được gọi bất cứ khi nào T
là int
. John has shown you cách thực hiện điều đó và Benoit has shown you những gì bạn cần làm để thực sự gọi hàm thứ hai.
Vấn đề của bạn là bằng cách cố gắng chuyêntest<>()
cho một loại cụ thể (int
) bằng cách sử dụng cú pháp hoàn toàn sai, bạn đã vô tình nhấn một hình thức cú pháp hợp lệ. (Loại may mắn.) Mẫu chức năng thứ hai đó đang sử dụng thông số mẫu không kiểu không kiểu. Đối với các loại bên cạnh, bạn có thể sử dụng những thứ khác làm thông số mẫu. Trong số các hàm khác (hàm, mẫu), bạn cũng có thể sử dụng hằng số tích phân, như int
. Nếu bạn đã cố thực hiện điều này với, ví dụ: double
, mã sẽ không thể biên dịch được.
Mẫu test<>()
thứ hai của bạn là quá tải của mẫu đầu tiên có thể được sử dụng với số nguyên không đổi. Đó là lý do tại sao test<0>()
của Benoit sẽ biên dịch.
Đối với một chuyên môn đầy đủ (không có phần chuyên môn hóa cho chức năng mẫu, có chỉ là quá tải; lớp mẫu, tuy nhiên, không có chuyên môn hóa một phần), bạn phải luôn luôn cung cấp một danh sách tham số mẫu trống (template<>
) và đặt các loại chuyên biệt đằng sau mã định danh test<int>
.
Trong ví dụ int() của bạn được hiểu là kiểu int (void) (tức là hàm). So sánh với std :: tr1 :: function. –
FuleSnabel