Podczas czytania this, jestem zdezorientowany przez następujące przykłady:Funkcja szablonu specjalizacji
// 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)
Tutaj (c)
wyraźna specjalizacja (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
Tutaj (c)
wyraźna specjalizacja (a)
. Dlaczego? Czy to ze względu na kolejność składania deklaracji?
Odręcznie Powiedziałbym "tak" i zakładając, że kod jest ważny, jest to jedyna możliwa odpowiedź. Ale pytanie brzmi, czy drugi kod jest ważny. Uważam, że jest to ważne, ale znalezienie tego w standardzie mogłoby być dużo pracy ... –
@Alf P. Steinbach: dlaczego drugi kod nie może być ważny? – Donotalo
@Donato: lekceważenie autorów (którzy naprawdę znają swoje rzeczy, jeśli chodzi o szablony) Jestem po prostu ostrożny wobec kodu, który ma zależny od zamówienia lub inny bardziej "arbitralny" efekt. Standard ma na celu ochronę przed takimi rzeczami, na przykład dwufazową kompilacją szablonów chroniących przed tego typu rzeczami. Więc po prostu mam <0.5% osób uważa, że może istnieć jakaś zasada dotycząca tego problemu, a może nawet taka, która nie wymaga żadnej diagnostyki. –