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

[SOLUCIONADO] Problemas con clases y plantillas

Estas en el tema de Problemas con clases y plantillas en el foro de C/C++ en Foros del Web. Hola: Estaba intentando hacer un programa para manejar grafos. Lo he hecho poniendo en cada nodo un dato char , y sin peso en las ...
  #1 (permalink)  
Antiguo 20/01/2014, 03:39
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Problemas con clases y plantillas

Hola:
Estaba intentando hacer un programa para manejar grafos.
Lo he hecho poniendo en cada nodo un dato char, y sin peso en las aristas.
Me funciona, pero ahora quiero hacerlo con plantillas, para que el nodo acepte en principio cualquier tipo de datos básico, y de paso, ponerle peso a las aristas.

Esta es la definición de las clases que sí funcionan:
Código C++:
Ver original
  1. struct arista;//declaración previa
  2.  
  3. struct nodo
  4. {
  5.     char nombre;
  6.     nodo* siguiente;
  7.     arista* adyacente;
  8.     int nPadres;
  9.     nodo (char c, nodo* s=0, arista* a=0, int n=0);
  10. };
  11.  
  12. struct arista
  13. {
  14.     nodo* destino;
  15.     arista* siguiente;
  16.     arista* anterior;
  17.     arista(nodo* d=0, arista* s=0, arista* an=0);
  18. };
  19.  
  20. typedef nodo* pNodo;
  21. typedef arista* pArista;

y éste es el intento para pasar a plantillas:
Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. template <class DATOA>
  4. struct arista;//declaración previa
  5.  
  6. template <class DATON>
  7. struct nodo
  8. {
  9.     DATON datonodo;
  10.     nodo<DATON>* siguiente;
  11.     arista<DATOA>* adyacente;
  12.     int nPadres;
  13.     nodo (char c, nodo* s=0, arista* a=0, int n=0);
  14. };
  15.  
  16. template <class DATOA>
  17. struct arista
  18. {
  19.     DATOA datoarista;
  20.     nodo<DATON>* destino;
  21.     arista<DATOA>* siguiente;
  22.     arista<DATOA>* anterior;
  23.     arista(nodo* d=0, arista* s=0, arista* an=0);
  24. };
  25.  
  26. typedef nodo<DATON>* pNodo;
  27. typedef arista<DATOA>* pArista;

Pero parece que no voy bien encaminado, ya que el compilador me dice que
DATOA no se declaró en ese ambito refiriéndose a la arista que se encuentra en nodo

e igualmente DATON no se declaró en ese ambito refiriéndose al nodo que se encuentra en arista


¿Alquien me sabe decir cómo implementar las plantillas en éste caso?

Como siempre, gracias por adelantado!!
  #2 (permalink)  
Antiguo 20/01/2014, 22:37
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 5 meses
Puntos: 61
Respuesta: Problemas con clases y plantillas

Intenta utilizar 2 parametros para cada plantilla, osea
Código C++:
Ver original
  1. template <class DATOA, typename DATON>
  2. struct arista;//declaración previa
  3.  
  4. template <class DATON, typename DATOA>
  5. struct nodo
  6. {
  7.     DATON datonodo;
  8.     nodo<DATON,DATOA>* siguiente;
  9.     arista<DATOA,DATON>* adyacente;
  10.     int nPadres;
  11.     nodo (char c, nodo* s=0, arista<DATOA, DATON>* a=0, int n=0);
  12. };

lo mismo con arista.
Luego mas abajo, al instanciar, utiliza los tipos a instanciar, olvidandote de DATOA y DATON, utilizados solo en la definicion del template.

Por ejemplo
Código C++:
Ver original
  1. typedef nodo<int,float>* pNodo;
  2. typedef arista<float,int>* pArista;
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 22/01/2014, 11:03
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 1 mes
Puntos: 10
Respuesta: Problemas con clases y plantillas

Muchas gracias CalgaryCorpus:

Disculpa si no te he respondido antes, pero he estado aseando el código y hasta hoy no había retomado el tema.

Cita:
Luego mas abajo, al instanciar, utiliza los tipos a instanciar, olvidandote de DATOA y DATON, utilizados solo en la definicion del template.
Gracias por no olvidarte de éste detalle. Si no, me hubiera tirado otras tantas horas intentando saber qué ocurría.
Desgraciadamente, eso significa que no puedo usar typedef con las plantillas, al menos para mantenerlas genéricas.

Gracias de nuevo

Etiquetas: clases, compilador, funcion, int, plantillas, programa
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 13:49.