Trong khi đọc this, tôi đang bối rối bởi các ví dụ sau:Chức năng mẫu chuyên môn
// Example 2: Explicit specialization
//
template<class T> // (a) a base template
void f(T);
template<class T> // (b) a second base template, overloads (a)
void f(T*); // (function templates can't be partially
// specialized; they overload instead)
template<> // (c) explicit specialization of (b)
void f<>(int*);
// ...
int *p;
f(p); // calls (c)
Ở đây, (c)
là một chuyên môn hóa rõ ràng của (b)
.
// Example 3: The Dimov/Abrahams Example
//
template<class T> // (a) same old base template as before
void f(T);
template<> // (c) explicit specialization, this time of (a)
void f<>(int*);
template<class T> // (b) a second base template, overloads (a)
void f(T*);
// ...
int *p;
f(p); // calls (b)! overload resolution ignores
// specializations and operates on the base
// function templates only
Đây (c)
là chuyên môn rõ ràng về (a)
. Tại sao vậy? Đây có phải là do thứ tự khai báo không?
Ngoại ý Tôi chỉ muốn nói "có" và giả sử mã hợp lệ là câu trả lời duy nhất có thể. Nhưng câu hỏi đặt ra là liệu mã thứ hai có hợp lệ hay không. Tôi tin rằng nó là hợp lệ, nhưng việc tìm kiếm điều này trong tiêu chuẩn có thể là nhiều công việc ... –
@Alf P. Steinbach: tại sao mã thứ hai không thể hợp lệ? – Donotalo
@Donato: bỏ qua các tác giả (những người thực sự (TM) biết nội dung của họ khi nói đến các mẫu) Tôi chỉ cảnh giác với mã có phụ thuộc vào thứ tự hoặc hiệu ứng "tùy ý" khác. Tiêu chuẩn được thiết kế để bảo vệ chống lại những thứ như vậy, để wit, biên dịch hai pha của các mẫu bảo vệ chống lại loại điều đó. Vì vậy, tôi chỉ có một <0.5% cảm giác rằng chỉ có thể có một số quy tắc về nó, sau đó có thể là một trong đó không yêu cầu bất kỳ chẩn đoán. –