AFAIK, das in C ++ 0x geändert wurde.
Ich denke, es war nur ein Versehen (wenn man bedenkt, dass man den partiellen Spezialisierungseffekt immer mit ausführlicherem Code erzielen kann, indem man die Funktion als static
Mitglied einer Klasse platziert).
Sie können den entsprechenden DR (Fehlerbericht) nachschlagen, falls vorhanden.
EDIT : Wenn ich das überprüfe, finde ich, dass andere das auch geglaubt haben, aber niemand kann eine solche Unterstützung im Standardentwurf finden. Dieser SO-Thread scheint darauf hinzudeuten, dass eine teilweise Spezialisierung von Funktionsvorlagen in C ++ 0x nicht unterstützt wird .
EDIT 2 : nur ein Beispiel dafür, was ich unter "Platzieren der Funktion als static
Mitglied einer Klasse" verstanden habe:
#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
}
template<typename T, typename U> void f(T t, U u) {}
auchtemplate<> void f(int t, char u) {}
erlaubt.