Para no hablar en plan genérico, voy a particularizar los templates. Te permitirá entender mejor el problema.
- Nodo<char> almacena un char*, es decir, un puntero a char.
- Lista<char>::Insertar( ) recibe un char*
- Al imprimir la lista haces:
Código C++:
Ver originalcout<< actual->getElemento()<< endl;
es decir, estás imprimiendo un char*. Da la casualidad que char* es el tipo utilizado por las cadenas de caracteres... luego cout va a volcar caracteres por pantalla hasta que se encuentre con el primer caracter nulo. Da la casualidad también que no has añadido los caracteres a la lista, sino que has añadido su posición en memoria... por algo almacenas punteros. El caso es que los punteros de Nodo<char> apuntan directamente a la cadena original... luego al volcar el char* te va a imprimir el contenido original de la cadena, pero empezando por el caracter que corresponda.
Soluciones... veo dos posibles:
Solución chapucera
Cambias el cout de
Lista<T>::ImprimeLista para que luzca tal que:
Código C++:
Ver originalcout<< *actual->getElemento()<< endl;
De esta forma no estarás volcando un
char*, sino simplemente un
char Solución buena
Lo suyo sería modificar los templates. El comportamiento que yo esperaría de un template tipo
Nodo<T> es que si yo creo un
Nodo<char>, esta estructura trabaje con el tipo char, no con el tipo char*... si resulta que necesito trabajar con char* entonces crearé una estructura tal que
Nodo<char*>. Este cambio de concepto te permitirá crear templates más consistentes y versátiles.
Por supuesto además de
Nodo<T> también tendrás que modificar
Lista<T> para que deje de usar punteros
T* sin venir a cuento. Es una solución más laboriosa pero a la vez más limpia y, por supuesto, es la solución que yo te recomiendo.
Un saludo.