Estoy jugando con plantillas y especialización parcial, pero hay una especialización que no sé cómo escribir ... Simplificaré el código para facilitar la lectura.Especialización parcial con el tipo anidado en una clase con plantilla
condiser Vamos
template <typename T>
class x
{
...
};
Por lo general, puedo especializar así:
class x<a_type>
{
...
};
También funciona con tipos de plantillas:
template <typename T>
class x<std::vector<T>>
{
...
}
Ahora me gustaría hacer la especialización de un tipo anidado en una clase con plantilla:
template <typename T>
class y
{
struct nested_type
{
y a_member;
};
...
};
// Here comes the specialization
template <typename T>
class x<y<T>::nested_type>
{
...
};
Esto falla. También traté de poner 'typename' antes de y :: nested_type pero no resolvió el problema. El error del compilador es:
type/value mismatch at argument 1 in template parameter list for ‘template <class T> struct x’
Lo que quiero hacer parece lógico, pero no estoy seguro de si es posible. Estoy usando C++ 0x con g ++ - 4.5. ¿Alguien sabe la sintaxis correcta para escribir tal especialización?
Creo que necesitas editar la pregunta. Debe ser 'clase x <....>', no 'clase <....>' en los primeros dos bloques. ¿Seguro que has escrito cuidadosamente _todo_? –
Sí, tienes razón. Eso es solo un pequeño error en mi mensaje, ya que no copié mi código pero preferí usar 'x' o' y' para simplificar el problema. Probé con ejemplos más pequeños, pero la respuesta de Mikael parece buena: no pude hacer un pequeño ejemplo de trabajo, y créanme, ¡probé muchas cosas! – neodelphi
Tenga en cuenta que obtendrá un mensaje de error más sensible de GCC si utiliza la sintaxis "correcta", 'plantilla clase x :: tipo_animado>' en lugar de 'plantilla clase x :: tipo_anatizado>' (agregado 'typename'). –
ildjarn