Warum ist eine teilweise Spezialisierung einer verschachtelten Klassenvorlage zulässig, während dies nicht vollständig ist?

    template<int x> struct A {                                                                                                    
        template<int y> struct B {};.                                                                                             
        template<int y, int unused> struct C {};                                                                                  
    };                                                                                                                            

    template<int x> template<> 
    struct A<x>::B<x> {}; // error: enclosing class templates are not explicitly specialized

    template<int x> template<int unused> 
    struct A<x>::C<x, unused> {}; // ok

Warum ist die explizite Spezialisierung einer inneren, verschachtelten Klasse (oder Funktion) nicht zulässig, wenn die äußere Klasse nicht ebenfalls spezialisiert ist? Seltsamerweise kann ich dieses Verhalten umgehen, wenn ich nurteilweise Spezialisieren Sie die innere Klasse, indem Sie einfach einen Dummy-Template-Parameter hinzufügen. Macht die Dinge hässlicher und komplexer, aber es funktioniert.

Ich würde komplette Spezialisierungen als Teilmenge von Teilspezialisierungen betrachten - insbesondere, weil Sie jede komplette Spezialisierung durch Hinzufügen eines Dummy-Parameters als Teil ausdrücken können. Diese Disambiguierung zwischen Teil- und Vollspezialisierung macht für mich also keinen Sinn.

Leider hat sich niemand bei comp.std.c ++ getraut, zu antworten, also lege ich es hier wieder mit einem Kopfgeld auf.

Hinweis: Ich benötige diese Funktion für rekursive Vorlagen der inneren Klasse für einen Satz der äußeren Klasse, und die Spezialisierung des inneren Parameters hängt vom äußeren Vorlagenparameter ab.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage