Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Templates para clase derivada.

Estas en el tema de Templates para clase derivada. en el foro de C/C++ en Foros del Web. Buenas a todos, tengo una clase base implementada con plantillas de manera: Código: template <class G> class colection{ private: G *T; int n; int nmax; ...
  #1 (permalink)  
Antiguo 14/12/2014, 06:58
 
Fecha de Ingreso: diciembre-2014
Mensajes: 1
Antigüedad: 9 años, 11 meses
Puntos: 0
Templates para clase derivada.

Buenas a todos, tengo una clase base implementada con plantillas de manera:

Código:
template <class G>

class colection{
	private:
		G *T;
		int n;
		int nmax;
	public:
Y tengo una clase derivada de esta:

Código:
template <class G1, class G2>
class conjunto:public colection<G2>{
	const int c;
	char *n;

	public:
Y me gustaría saber como especializar un método de la clase derivada con plantillas, es decir, si yo quisiera especializar un metodo get() de la clase derivada pondría:

Código:
template <>
void conjunto<float, ?>::getn(){}
Mi duda esta en que poner entre corchete dentro del método especializado de la clase derivada.
  #2 (permalink)  
Antiguo 15/12/2014, 02:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Templates para clase derivada.

Deberías poner la declaración de la función que pretendes especializar. Dependiendo de cómo esté declarada, variará la forma de crear la especialización.

También sería interesante saber en cual de las dos clases está declarada dicha función y si la especialización la quieres realizar en la misma clase "conjunto" o en una derivada.

Un saludo.

----

Edito:

Bueno, en cualquier caso te pongo un poco casos generales.

Si tu tienes:

Código C++:
Ver original
  1. template< class T1, class T2 >
  2. class POO
  3. {
  4.   public:
  5.     void func( T1 a, T2 b )
  6.     {
  7.     }
  8. };

Y tu intención es especializar func, tu única posibilidad es sobrecargar la función:

Código C++:
Ver original
  1. template< class T1, class T2 >
  2. class POO
  3. {
  4.   public:
  5.     void func( T1 a, T2 b )
  6.     {
  7.     }
  8.  
  9.     void func( T1 a, int b )
  10.     {
  11.     }
  12. };

El problema que plantea este diseño es que si alguien intenta usar una instancia del template tal que:

Código C++:
Ver original
  1. POO<T, int > clase;

Se encontrará con el problema de que el código no compilará porque tendrás dos funciones con el mismo nombre y la misma firma "func(T, int)".

Si, por contra, en vez de ser la clase la que aporta los parámetros, es la propia función la cosa cambia:

Código C++:
Ver original
  1. class POO
  2. {
  3.   public:
  4.     template< class T1, class T2 >
  5.     void func( T1 a, T2 b )
  6.     {
  7.     }
  8. };
Ahora, el parámetro a especializar no depende de la clase, sino de la propia función. En este caso, especializar la función es algo que se consigue con un código tal que:

Código C++:
Ver original
  1. class POO
  2. {
  3.   public:
  4.     template< class T1, class T2 >
  5.     void func( T1 a, T2 b )
  6.     {
  7.     }
  8.  
  9.     template< class T1, int >
  10.     void func( T1 a, int b )
  11.     {
  12.     }
  13. };

Ahora, el código compilará sin problemas, porque el compilador sabe que para el caso de "func<T,int>( )" no debe "crear" dos funciones, sino que únicamente debe hacer uso de la especialización.

Si tu caso no se ajusta a estos que te he puesto, tendrás que aportar información adicional para poder darte una respuesta más concreta.

Un saludo.

Última edición por eferion; 15/12/2014 a las 02:34

Etiquetas: char, clase, int, templates
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:32.