Bueno, pues ya está solucionado,
Aparte de que no estaba bien el código (mirar cómo ha tratado la estructura y el resto), es que me daba el siguiente error:
El compilador necesita tener el código que implementa la función siempre visible para crear la versión personalizada al tipo de T sobre la marcha cuando la necesita.
Cuando separas .h y .cpp y en main.cpp haces los includes de los .h, el compilador no sabe como generar el cuerpo personalizado ni a char ni a int, y por lo tanto quedan indefinidos. Por eso protesta.
La solución es poner en el mismo .h de la plantilla todas las definiciones y las implementaciones, ya sea como funciones inline, si son cortas, o despues de la definición de la clase si son más complicadas, dejando la definición de la clase más limpia.
Pongo el codigo para que sirva de ejemplo por si a alguien le sirve
list.h
menulista.cpp
Espero que a alguien le sirva de ayuda
Aparte de que no estaba bien el código (mirar cómo ha tratado la estructura y el resto), es que me daba el siguiente error:
Código [Seleccionar]
collect2: ld devolvió el estado de salida 1
El compilador necesita tener el código que implementa la función siempre visible para crear la versión personalizada al tipo de T sobre la marcha cuando la necesita.
Cuando separas .h y .cpp y en main.cpp haces los includes de los .h, el compilador no sabe como generar el cuerpo personalizado ni a char ni a int, y por lo tanto quedan indefinidos. Por eso protesta.
La solución es poner en el mismo .h de la plantilla todas las definiciones y las implementaciones, ya sea como funciones inline, si son cortas, o despues de la definición de la clase si son más complicadas, dejando la definición de la clase más limpia.
Pongo el codigo para que sirva de ejemplo por si a alguien le sirve
list.h
Código [Seleccionar]
#ifndef _LIST_H_
#define _LIST_H_
#include <cstdlib>
#define OK 1
#define ERROR 0
template <class T>
struct Node {
T info;
Node *next;
};
template <class T>
class List {
private:
Node<T> *_head, *_tail, *_cursor;
int _t;
public:
List();
bool empty();
void insertBegin(T i);
};
template <class T>
List<T>::List() {
_head = _cursor = _tail = NULL;
_t = 0;
}
template <class T>
void List<T>::insertBegin(T i) {
if(empty()) { //Lista esta vacia
T *aux;
aux = new T;
aux->info = i;
aux->next = _head;
_head = _cursor = _tail = aux;
_t++;
}
else { //Lista no esta vacia
T *aux;
aux = new T;
aux->info = i;
aux->next = _head;
_head = _cursor = aux;
_t++;
}
}
template <class T>
bool List<T>::empty() {
if(_head == NULL) {
return true;
}
else {
return false;
}
}
menulista.cpp
Código [Seleccionar]
#include "list.h"
#include <iostream>
using namespace std;
int main() {
List<int> lint;
List<char> lchar;
return 0;
}
Espero que a alguien le sirva de ayuda