2012-04-16 17 views
6

Mögliche Duplizieren:
Specialization of templated member function in templated classSpezialisierung ein Templat-Mitglied einer Template-Klasse

template <class T>  
class MyClass 
{ 
    template <int N> 
    void func() {printf("unspecialized\n");} 
}; 
template<class T> 
template<> 
MyClass<T>::func<0>() 
{ 
    printf("specialzied\n"); 
} 

Dies funktioniert nicht. Ist es möglich, eine Template-Methode einer Template-Klasse zu spezialisieren?

+1

Sie sollten die Fehlermeldung hinzufügen, die Sie erhalten, da "nicht funktioniert" uns wirklich nicht viel sagt. – sth

Antwort

13

Es kann nicht wie gewünscht durchgeführt werden. Aus irgendeinem Grunde (ich bin über die Gründe nicht sicher) explizite (d voll) Spezialisierung eines Mitglied Vorlage nur dann zulässig ist, wenn die umgebende Klasse auch explizit (das heißt voll) spezialisiert ist. Diese Anforderung ist im Sprachstandard explizit festgelegt (siehe 14.7.3/18 in C++ 98, C++ 03 und 14.7.3/16 in C++ 11).

Zur gleichen Zeit, Teil Spezialisierungen von Klassenmitglied Vorlagen erlaubt, die in vielen Fällen als eine Umgehung verwendet werden kann (wenn auch eine hässlichen eins). Aber offensichtlich ist es nur für Mitglieder Klasse Vorlagen anwendbar. Wenn es sich um Member Funktion Vorlagen handelt, muss eine alternative Lösung verwendet werden.

Zum Beispiel kann eine mögliche Abhilfe ist, den Anruf zu einem statischen Elemente einer Template-Klasse zu delegieren und die Klasse spezialisiert statt

template <class T>  
class MyClass 
{ 
    template <int N, typename DUMMY = void> struct Func { 
    static void func() { printf("unspecialized\n"); } 
    }; 

    template <typename DUMMY> struct Func<0, DUMMY> { 
    static void func() { printf("specialized\n"); } 
    }; 

    template <int N> void func() { Func<N>::func(); } 
}; 
(was oft als eine bessere Idee, als Spezialisierung der Funktionsschablonen http://www.gotw.ca/publications/mill17.htm empfohlen)
+0

Danke, das habe ich auch herausgefunden - ich muss die Containerklasse spezialisieren. Ihre Lösung mit einer Klasse für die Funktion ist vielleicht die beste Lösung in meinem Fall –

+0

Haben Sie eine Referenz für diese Anforderung? Ich habe die Teile des Standards durchgelesen, die aussagekräftig sind (beginnend mit §14.7.3) und konnte diese Anforderung nicht finden. –

+2

@Jerry: C++ 11 §14.7.3/16: "* ... mit der Ausnahme, dass die Deklaration nicht explizit eine Klassenmitgliedsvorlage spezialisieren soll, wenn ihre einschließenden Klassenvorlagen nicht explizit spezialisiert sind. *" – ildjarn