Ich habe eine Klassenvorlage innerhalb einer anderen Vorlage verschachtelt. Teilweise ist es einfach zu spezialisieren: Ich deklariere einfach eine weitere template< … >
Blocks innerhalb seines Elternteils.
Ich benötige jedoch eine weitere partielle Spezialisierung, die zufällig alle ihre lokalen Vorlagenargumente angibt. Das macht sie zu einer expliziten Spezialisierung. Explizite Spezialisierungen, aus welchem Grund auch immer, müssen im Namespace-Bereich liegen. Um sie außerhalb der übergeordneten Klasse zu deklarieren, muss die übergeordnete Klasse benannt werden, was eine nicht leere Liste von Template-Argumenten erfordert. Dies impliziert eine partielle Spezialisierung. Partielle Spezialisierung ist was ich tue, und es soll in einem beliebigen äußeren Rahmen funktionieren. Aber sowohl GCC als auch Comeau scheitern, die Vorlage Parameter in der übergeordneten Nominierung mit der partiellen Spezialisierung formale Argumente zu identifizieren.
template< class X > struct A {
template< class Y > struct B; // initial declaration OK
template< class Z >
struct B< A< Z > > {}; // partial OK as long as there's a local arg
template<> // ERROR: this syntax triggers explicit specialization
struct B< int > {};
};
template<> // ERROR: can't nest template<>s here (why?)
template< class X > // ERROR: can't deduce X from type of A<X>::B<int> (why?)
struct A< X >::B< int > {};
(Ich habe den ganzen nicht funktionierenden Code drin gelassen; kommentieren Sie ihn entsprechend, damit er Sinn ergibt).