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

[SOLUCIONADO] Plantilla no me reconoce la funcion miembro

Estas en el tema de Plantilla no me reconoce la funcion miembro en el foro de C/C++ en Foros del Web. Hola a todos, tengo un problema y es que el compilador no me reconoce la funcion miembro de mi plantilla de clase. Me sale el ...
  #1 (permalink)  
Antiguo 08/06/2015, 13:08
Avatar de GumiCat  
Fecha de Ingreso: mayo-2014
Ubicación: Argentina
Mensajes: 16
Antigüedad: 10 años
Puntos: 0
Sonrisa Plantilla no me reconoce la funcion miembro

Hola a todos, tengo un problema y es que el compilador no me reconoce la funcion miembro de mi plantilla de clase.
Me sale el siguiente error:

request for member `tamanio' in `pila1', which is of non-class type `Pila<int, 5> ()()'

La verdad no lo entiendo.
Mis códigos van así:

El encabezado de "pila.h"
Código C++:
Ver original
  1. #ifndef PILA_H
  2. #define PILA_H
  3.  
  4. template <typename T, int TAM>
  5. class Pila{
  6.    
  7. public:
  8.     Pila();
  9.    
  10.     int insertar(T );
  11.     int sacar(T *);
  12.     int existeElemento(T );
  13.     int estaLlena();
  14.     int estaVacia();
  15.     int tamanio();
  16.    
  17.     T operator=(T &);
  18.     T operator+(T &);
  19.     T operator+=(T &);
  20.    
  21. private:
  22.     int tam_pila;
  23.     T arreglo_pila[TAM];
  24.    
  25. };
  26.  
  27. #endif

Las definiciones en "pila.c"
Código C++:
Ver original
  1. #include <iostream>
  2. #include "pila.h"
  3.  
  4. template <typename T, int TAM>
  5. Pila<T, TAM>::Pila(){
  6.    
  7.     tam_pila = 0;
  8.     arreglo_pila = NULL;   
  9. }
  10.  
  11. template <typename T, int TAM>
  12. int Pila<T, TAM>::tamanio(){
  13.     return tam_pila;
  14. }

y la funcion main()

Código C++:
Ver original
  1. #include <iostream>
  2. #include "pila.h"
  3.  
  4. using std::cout;
  5. using std::endl;
  6.  
  7. int main()
  8. {
  9.    
  10.     Pila<int, 5> pila_enteros;
  11.    
  12.     cout << "El tamanio es: " << pila_enteros.tamanio() << "\n";
  13.    
  14.    
  15.    
  16.     return 0;
  17. }

Espero me puedan ayudar a solucionar mi problema
Gracias!

Última edición por GumiCat; 08/06/2015 a las 13:44
  #2 (permalink)  
Antiguo 08/06/2015, 14:05
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Plantilla no me reconoce la funcion miembro

Prueba a incluir las definiciones en el archivo de cabecera

http://stackoverflow.com/questions/4...he-header-file
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 08/06/2015, 19:06
Avatar de GumiCat  
Fecha de Ingreso: mayo-2014
Ubicación: Argentina
Mensajes: 16
Antigüedad: 10 años
Puntos: 0
Respuesta: Plantilla no me reconoce la funcion miembro

Ah, vale gracias no tenía idea de que no podía dividirse! :)
  #4 (permalink)  
Antiguo 09/06/2015, 01:52
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Plantilla no me reconoce la funcion miembro

Cita:
Iniciado por GumiCat Ver Mensaje
Ah, vale gracias no tenía idea de que no podía dividirse! :)
Los templates sí pueden dividirse... lo que pasa es que, de hacerlo, tiene sus propias reglas.

Un código normal de C++ tiene la siguiente estructura:
  • Tenemos un archivo de cabecera y otro con la implementación
  • En la implementación se añade un include a la cabecera. Este include tiene que estar al principio del archivo
  • Para hacer uso de la funcionalidad contenida en estos archivos, hay que añadir un include a la cabecera.


En los templates habría que seguir de la siguiente forma:
  • Tenemos un archivo de cabecera y otro con la implementación
  • En la cabecera se añade un include a la implementación. Este include tiene que estar al final del archivo
  • Para hacer uso de la funcionalidad contenida en estos archivos, hay que añadir un include a la cabecera.


Fíjate el cambio que se produce en el segundo punto.

¿Por qué esto es así? Sencillamente porque los templates son tratados de forma especial por el compilador. Cuando un compilador se encuentra con un template no genera absolutamente nada de código. Lo que hace es esperar a encontrar usos de ese template para generar las versiones específicas que se requieran. Para poder generar estas versiones específicas necesita tener TODO el código fuente del template disponible y la única forma de garantizar esto es que tanto declaración como implementación estén en el mismo archivo.

Como sabes, o sino ahora lo vas a aprender, los includes son sustituidos por el contenido del fichero "incluido" antes de proceder a la compilación. Es gracias a este preproceso por el que puedes separar la declaración y la implementación de los templates y que el código siga funcionando. El único requisito es que el compilador tenga disponible las dos partes del template en el momento en el que se encuentre cualquier uso.

Por supuesto, haciendo uso de lo que te acabo de comentar, habría otras maneras de dividir el template y que el código compile:

  • Tener la implementación y la declaración en dos archivos independientes, sin includes entre ellos y crear un tercer archivo que únicamente tenga dos includes, uno a la declaración y después otro a la implementación. Este tercer archivo es el que tendrás que incluir para usar el template
  • Añadir los dos includes (declaración e implementación) manualmente cada vez que necesites usar el template


Un saludo.
  #5 (permalink)  
Antiguo 09/06/2015, 02:44
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Plantilla no me reconoce la funcion miembro

Es un lujo tenerte en este subforo
__________________
Mi calculadora en Qt
  #6 (permalink)  
Antiguo 09/06/2015, 03:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Plantilla no me reconoce la funcion miembro

Cita:
Iniciado por dehm Ver Mensaje
Es un lujo tenerte en este subforo
Gracias por el cumplido :)

Etiquetas: c++, clases, funcion, plantilla
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 14:27.