AFAIK que ha cambiado en C ++ 0x.
Supongo que fue solo un descuido (considerando que siempre se puede obtener el efecto de especialización parcial con un código más detallado, colocando la función como static
miembro de una clase).
Puede buscar el DR (Informe de defectos) correspondiente, si lo hay.
EDITAR : revisando esto, encuentro que otros también han creído eso, pero nadie puede encontrar tal apoyo en el borrador del estándar. Este hilo SO parece indicar que la especialización parcial de las plantillas de funciones no es compatible con C ++ 0x .
EDICIÓN 2 : solo un ejemplo de lo que quise decir con "colocar la función como static
miembro de una clase":
#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) {}
tambiéntemplate<> void f(int t, char u) {}
está permitido.