Tengo una plantilla de clase anidada dentro de otra plantilla. Especializarlo parcialmente es fácil: acabo de declarar otro bloque template< … >
dentro de su padre.especialice una plantilla de miembro sin especializar su padre
Sin embargo, necesito otra especialización parcial que sucede para especificar todos sus argumentos de plantilla local. Esto lo convierte en una especialización explícita. Las especializaciones explícitas, por la razón que sea, deben estar en el ámbito del espacio de nombres. Para declararlo fuera de su clase principal, el padre debe estar nominado, lo que requiere una lista de argumentos de plantilla no vacía. Esto implica una especialización parcial. La especialización parcial es lo que estoy haciendo, y se supone que debe funcionar en un alcance externo arbitrario. Pero tanto GCC como Comeau no identifican el parámetro de plantilla en la nominación principal con los argumentos formales de especialización parcial.
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> {};
(I dejado todo mi código de parada en; comentar de manera apropiada para tratar de tener sentido.)
Por cierto, puede solucionarlo agregando un argumento ficticio, por ejemplo, un 'int' que siempre es' 0'. Esta es la primera vez que juego con C++ 0x; Estoy tratando de iterar sobre una 'tupla'. He hecho este tipo de cosas antes, y es molesto que la 'tupla' de C++ 0x sea menos poderosa que la de Boost ... iterar a través de argumentos de plantilla es una funcionalidad útil que no debe seguir siendo un rito de paso. Ah, y para todos mis problemas GCC todavía ICE una vez que corrijo todos los errores. – Potatoswatter