2013-06-16 15 views
5

Ich habe Probleme, ein inneres Template zu spezialisieren, wenn alle Parameter bekannt sind. Hier ist ein Beispiel:Spezialisiertes inneres Template mit Standardparametern

template < typename T0 > 
struct outer 
{ 
    template < typename T1 = void, typename T2 = void > 
    struct inner 
    { 
     typedef T1 type; 
    }; 
}; 
template < typename T0 > 
template < typename T1 > 
struct outer<T0>::inner<double,T1> { typedef int type; }; 

Das funktioniert gut. Wenn ich wie so stattdessen die innere Vorlage angeben, nicht wahr:

template < typename T0 > 
template < > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

Dafür erhalte ich die Fehlermeldung „ungültige explizite Spezialisierung vor‚>‘Token ... umschließenden Klasse Vorlagen nicht explizit spezialisiert sind .. .Template-Parameter, die in der Teilspezialisierung nicht verwendet werden: ... T0 ". Nicht sicher, dass WTAF hier vorgeht.

Ich habe auch versucht dies:

template < typename T0 > 
struct outer<T0>::inner<double,void> { typedef int type; }; 

ich diese und die Fehlermeldung nicht überraschend, zum Scheitern verurteilt erwarten ist. Es war: "zu wenige Template-Parameter-Listen".

Also, was ist der richtige Weg, dies zu tun? Ich kann natürlich herumhacken, aber wenn ich nicht muss, würde ich es nicht bevorzugen.

+0

bezogen werden: http://stackoverflow.com/questions/9219157/why-cant-i-specialize-the-nested-template -Mitglied ohne Spezialisierung -einschließen? lq = 1 –

+0

Hmm ... Ich habe eine Suche gemacht, aber das tauchte nicht auf. Darf vorher nicht die richtige Ziege geopfert haben. –

Antwort

7

Das ist nicht erlaubt. Sie können ein Mitglied einer Klassenvorlage nicht vollständig spezialisieren, die nicht vollständig auf die Klasse spezialisiert ist.

Per Absatz 14.7.16 des C++ 11 Standard:

In einer expliziten Spezialisierung Erklärung für ein Mitglied einer Klasse-Vorlage oder ein Mitglied Vorlage, die in Namespacebereich, der Mitglied Vorlage wird und einige seiner umschließenden Klassenvorlagen können weiterhin unspezialisiert, bleiben, mit der Ausnahme, dass die Deklaration eine Klassenmembervorlage nicht explizit spezialisieren soll, wenn ihre umschließenden Klassenvorlagen nicht explizit auf spezialisiert sind. [...]

Auch Absatz 14.7.3/15 des C++ 11 Standard sagt:

Ein Mitglied oder ein Mitglied Vorlage kann in vielen umgebenden Klasse Vorlagen verschachtelt werden. In einer expliziten Spezialisierung für ein solches Mitglied muss der Mitgliedererklärung ein template<> für jede einschließende Klassenvorlage vorangestellt werden, die explizit spezialisiert ist. [Beispiel:

template<class T1> class A { 
    template<class T2> class B { 
     void mf(); 
    }; 
}; 
template<> template<> class A<int>::B<double>; 
template<> template<> void A<char>::B<char>::mf(); 

- Ende Beispiel]

+0

Es ist keine Member-Funktion, aber ich nehme an, die gleiche Regel gilt für verschachtelte Typen? –

+0

Angenommen, Nate ist korrekt. Kannst du Kapitel/Vers zitieren? 03 ist besser, aber 11 würde tun. –

+1

@CrazyEddie: Ja, ich bin auf der Suche nach einem Angebot –

Verwandte Themen