AFAIK che è cambiato in C ++ 0x.
Immagino sia stata solo una svista (considerando che puoi sempre ottenere l'effetto di specializzazione parziale con codice più dettagliato, posizionando la funzione come static
membro di una classe).
Potresti cercare il DR (Rapporto sui difetti) pertinente, se presente.
EDIT : controllando questo, trovo che anche altri lo abbiano creduto, ma nessuno è in grado di trovare un tale supporto nella bozza di standard. Questo thread SO sembra indicare che la specializzazione parziale dei modelli di funzione non è supportata in C ++ 0x .
EDIT 2 : solo un esempio di cosa intendevo con "posizionare la funzione come static
membro di una classe":
#include <iostream>
using namespace std;
void say( char const s[] ) { std::cout << s << std::endl; }
namespace detail {
template< class T, class U >
struct F {
static void impl() { say( "1. primary template" ); }
};
template<>
struct F<int, char> {
static void impl() { say( "2. <int, char> explicit specialization" ); }
};
template< class T >
struct F< char, T > {
static void impl() { say( "3. <char, T> partial specialization" ); }
};
template< class T >
struct F< T, int > {
static void impl() { say( "4. <T, int> partial specialization" ); }
};
}
template< class T, class U >
void f() { detail::F<T, U>::impl(); }
int main() {
f<char const*, double>();
f<int, char>();
f<char, double>();
f<double, int>();
}
template<typename T, typename U> void f(T t, U u) {}
anchetemplate<> void f(int t, char u) {}
è permesso.