Problemas con template
Hola
Tengo problemas con una cola genérica q estoy implementando.
Me da los siguientes errores de compilación:
CODE
/home/harpo/UNEX/Laboratorio2/monfraguex/src/monfrague.cpp:29: undefined reference to `colagen<int>::colagen()'
/home/harpo/UNEX/Laboratorio2/monfraguex/src/monfrague.cpp:44: undefined reference to `colagen<int>::~colagen()'
/home/harpo/UNEX/Laboratorio2/monfraguex/src/monfrague.cpp:44: undefined reference to `colagen<int>::~colagen()'
collect2: ld returned 1 exit status
make[2]: *** [monfraguex] Error 1
make[2]: Debido a los errores, el objetivo `all' no se reconstruyó.
make[2]: No se hace nada para `all-am'.
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
***Terminado con estado 2***
Adjunto el código.
Archivo cabecera
CODE
#ifndef COLAGEN_H
#define COLAGEN_H
#include <iostream>
using namespace std;
/**
@author Fernando Jiménez Moreno
@file colagen.h
*/
template <class Tipo>
class colagen {
typedef struct Nodo {
Nodo* suce;
Tipo dato;
};
Nodo* frente;
Nodo* fin;
int n_elementos;
public:
colagen();
colagen(const colagen &c);
void insertar(Tipo dat);
Tipo frenteCola();
void borrarFrente();
bool vacia();
int elementos();
~colagen();
};
#endif
Implementación
CODE
#include "colagen.h"
template <class Tipo> colagen <Tipo>::colagen()
{
frente=fin=NULL;
n_elementos=0;
}
template <class Tipo> colagen <Tipo>::~colagen()
{
cout<<"Destructor de cola"<<endl;
while (!vacia())
{
borrarFrente();
if (vacia())
fin=NULL;
}
}
template <class Tipo> void colagen <Tipo>::insertar(Tipo dat)
{
//se crea un nuevo nodo de la cola con el puntero al ave a insertar
Nodo* nodo;
nodo=new Nodo;
nodo->dato=dat;
nodo->suce=NULL;
//en caso de que la cola estuviese vacia
if (frente==NULL)
frente=nodo; //pondria al nuevo nodo como frente de la cola
else
fin->suce=nodo; //si no esta vacia, el nuevo entra como el siguiente al nodo q hasta
//entonces era el ultimo
fin=nodo; // el nuevo nodo pasa a ser el ultimo de la cola, este o no vacia
n_elementos++;
cout<<"Elemento insertado en la cola. Hay "<<n_elementos<<" en la cola"<<endl<<endl;
}
template <class Tipo> Tipo colagen <Tipo>::frenteCola()
{
if (!vacia())
return frente->dato;
}
template <class Tipo> bool colagen <Tipo>::vacia()
{
if (frente==NULL)
return true;
else
return false;
}
template <class Tipo> void colagen <Tipo>::borrarFrente()
{
Nodo* nodoaux;
nodoaux=frente;
//si la cola no esta vacia
if (!vacia())
{
//el elemento sucesor del frente de la cola pasa a ser el frente de la misma
frente=frente->suce;
//y se elimina el frente anterior
delete nodoaux;
n_elementos--;
}
}
template <class Tipo> int colagen <Tipo>::elementos()
{
return n_elementos;
}
Y el main (monfrague.cpp)
CODE
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
/*#include "presa.h"
#include "rapaz.h"
#include "carronhera.h"*/
#include "colagen.h"
using namespace std;
int main(int argc, char *argv[])
{
int dato;
colagen <int> cola;
cout << "Monfrague" << endl;
cout<<"............"<<endl<<endl;
/* while(!cola.vacia())
{
dato=cola.frenteCola();
// dato->mostrar();
cola.borrarFrente();
//delete dato;
cout<<"Quedan "<<cola.elementos()<<" en la cola"<<endl<<endl;
}
*/
return EXIT_SUCCESS;
Los errores son los típicos de no incluir un archivo cabecera, pero se ve claramente que incluyo el colagen.h.
No se de dónde carajo se saca los malditos errores... en el irc me dicen q está todo bien y q compila perfectamente blink.gif ; pero ya veis... a mi no.
A ver si veis algún error.
Muchas gracias. Salu2
Tengo problemas con una cola genérica q estoy implementando.
Me da los siguientes errores de compilación:
CODE
/home/harpo/UNEX/Laboratorio2/monfraguex/src/monfrague.cpp:29: undefined reference to `colagen<int>::colagen()'
/home/harpo/UNEX/Laboratorio2/monfraguex/src/monfrague.cpp:44: undefined reference to `colagen<int>::~colagen()'
/home/harpo/UNEX/Laboratorio2/monfraguex/src/monfrague.cpp:44: undefined reference to `colagen<int>::~colagen()'
collect2: ld returned 1 exit status
make[2]: *** [monfraguex] Error 1
make[2]: Debido a los errores, el objetivo `all' no se reconstruyó.
make[2]: No se hace nada para `all-am'.
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
***Terminado con estado 2***
Adjunto el código.
Archivo cabecera
CODE
#ifndef COLAGEN_H
#define COLAGEN_H
#include <iostream>
using namespace std;
/**
@author Fernando Jiménez Moreno
@file colagen.h
*/
template <class Tipo>
class colagen {
typedef struct Nodo {
Nodo* suce;
Tipo dato;
};
Nodo* frente;
Nodo* fin;
int n_elementos;
public:
colagen();
colagen(const colagen &c);
void insertar(Tipo dat);
Tipo frenteCola();
void borrarFrente();
bool vacia();
int elementos();
~colagen();
};
#endif
Implementación
CODE
#include "colagen.h"
template <class Tipo> colagen <Tipo>::colagen()
{
frente=fin=NULL;
n_elementos=0;
}
template <class Tipo> colagen <Tipo>::~colagen()
{
cout<<"Destructor de cola"<<endl;
while (!vacia())
{
borrarFrente();
if (vacia())
fin=NULL;
}
}
template <class Tipo> void colagen <Tipo>::insertar(Tipo dat)
{
//se crea un nuevo nodo de la cola con el puntero al ave a insertar
Nodo* nodo;
nodo=new Nodo;
nodo->dato=dat;
nodo->suce=NULL;
//en caso de que la cola estuviese vacia
if (frente==NULL)
frente=nodo; //pondria al nuevo nodo como frente de la cola
else
fin->suce=nodo; //si no esta vacia, el nuevo entra como el siguiente al nodo q hasta
//entonces era el ultimo
fin=nodo; // el nuevo nodo pasa a ser el ultimo de la cola, este o no vacia
n_elementos++;
cout<<"Elemento insertado en la cola. Hay "<<n_elementos<<" en la cola"<<endl<<endl;
}
template <class Tipo> Tipo colagen <Tipo>::frenteCola()
{
if (!vacia())
return frente->dato;
}
template <class Tipo> bool colagen <Tipo>::vacia()
{
if (frente==NULL)
return true;
else
return false;
}
template <class Tipo> void colagen <Tipo>::borrarFrente()
{
Nodo* nodoaux;
nodoaux=frente;
//si la cola no esta vacia
if (!vacia())
{
//el elemento sucesor del frente de la cola pasa a ser el frente de la misma
frente=frente->suce;
//y se elimina el frente anterior
delete nodoaux;
n_elementos--;
}
}
template <class Tipo> int colagen <Tipo>::elementos()
{
return n_elementos;
}
Y el main (monfrague.cpp)
CODE
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <iostream>
#include <cstdlib>
/*#include "presa.h"
#include "rapaz.h"
#include "carronhera.h"*/
#include "colagen.h"
using namespace std;
int main(int argc, char *argv[])
{
int dato;
colagen <int> cola;
cout << "Monfrague" << endl;
cout<<"............"<<endl<<endl;
/* while(!cola.vacia())
{
dato=cola.frenteCola();
// dato->mostrar();
cola.borrarFrente();
//delete dato;
cout<<"Quedan "<<cola.elementos()<<" en la cola"<<endl<<endl;
}
*/
return EXIT_SUCCESS;
Los errores son los típicos de no incluir un archivo cabecera, pero se ve claramente que incluyo el colagen.h.
No se de dónde carajo se saca los malditos errores... en el irc me dicen q está todo bien y q compila perfectamente blink.gif ; pero ya veis... a mi no.
A ver si veis algún error.
Muchas gracias. Salu2