AFAIK, cela a changé dans C++0x.
Je suppose que ce n'était qu'un oubli (étant donné que l'on peut toujours obtenir l'effet de spécialisation partielle avec un code plus verbeux, en plaçant la fonction en tant que static
membre d'une classe).
Vous pouvez consulter le DR (Defect Report) correspondant, s'il y en a un.
EDIT : en vérifiant cela, je constate que d'autres personnes l'ont également cru, mais personne n'est en mesure de trouver un tel soutien dans le projet de norme. Ce fil de SO semble indiquer que la spécialisation partielle des modèles de fonctions n'est pas supportée en C++0x .
EDIT 2 : juste un exemple de ce que j'entendais par "placer la fonction en tant que static
membre d'une classe" :
#include <iostream>
using namespace std;
// template<typename T, typename U> void f() {} //allowed!
// template<> void f<int, char>() {} //allowed!
// template<typename T> void f<char, T>() {} //not allowed!
// template<typename T> void f<T, int>() {} //not allowed!
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" ); }
};
} // namespace detail
template< class T, class U >
void f() { detail::F<T, U>::impl(); }
int main() {
f<char const*, double>(); // 1
f<int, char>(); // 2
f<char, double>(); // 3
f<double, int>(); // 4
}