Je n'ai aucune idée de pourquoi cela se passe, car je crois que j'ai tout correctement déclarées et définies.
J'ai le programme suivant, conçu avec des modèles. C'est une simple mise en œuvre d'une file d'attente, avec les fonctions de membre "ajouter", "soustraire" et "imprimer".
J'ai défini le nœud de la file d'attente à l'amende "nodo_colaypila.h":
#ifndef NODO_COLAYPILA_H
#define NODO_COLAYPILA_H
#include <iostream>
template <class T> class cola;
template <class T> class nodo_colaypila
{
T elem;
nodo_colaypila<T>* sig;
friend class cola<T>;
public:
nodo_colaypila(T, nodo_colaypila<T>*);
};
Ensuite, la mise en œuvre de "nodo_colaypila.cpp"
#include "nodo_colaypila.h"
#include <iostream>
template <class T> nodo_colaypila<T>::nodo_colaypila(T a, nodo_colaypila<T>* siguiente = NULL)
{
elem = a;
sig = siguiente;//ctor
}
Par la suite, la définition et la déclaration de la file d'attente de classe de modèle et de ses fonctions:
"cola.h":
#ifndef COLA_H
#define COLA_H
#include "nodo_colaypila.h"
template <class T> class cola
{
nodo_colaypila<T>* ult, pri;
public:
cola<T>();
void anade(T&);
T saca();
void print() const;
virtual ~cola();
};
#endif // COLA_H
"cola.cpp":
#include "cola.h"
#include "nodo_colaypila.h"
#include <iostream>
using namespace std;
template <class T> cola<T>::cola()
{
pri = NULL;
ult = NULL;//ctor
}
template <class T> void cola<T>::anade(T& valor)
{
nodo_colaypila <T> * nuevo;
if (ult)
{
nuevo = new nodo_colaypila<T> (valor);
ult->sig = nuevo;
ult = nuevo;
}
if (!pri)
{
pri = nuevo;
}
}
template <class T> T cola<T>::saca()
{
nodo_colaypila <T> * aux;
T valor;
aux = pri;
if (!aux)
{
return 0;
}
pri = aux->sig;
valor = aux->elem;
delete aux;
if(!pri)
{
ult = NULL;
}
return valor;
}
template <class T> cola<T>::~cola()
{
while(pri)
{
saca();
}//dtor
}
template <class T> void cola<T>::print() const
{
nodo_colaypila <T> * aux;
aux = pri;
while(aux)
{
cout << aux->elem << endl;
aux = aux->sig;
}
}
Ensuite, j'ai un programme pour tester ces fonctions comme suit:
"main.cpp"
#include <iostream>
#include "cola.h"
#include "nodo_colaypila.h"
using namespace std;
int main()
{
float a, b, c;
string d, e, f;
cola<float> flo;
cola<string> str;
a = 3.14;
b = 2.71;
c = 6.02;
flo.anade(a);
flo.anade(b);
flo.anade(c);
flo.print();
cout << endl;
d = "John";
e = "Mark";
f = "Matthew";
str.anade(d);
str.anade(e);
str.anade(f);
cout << endl;
c = flo.saca();
cout << "First In First Out Float: " << c << endl;
cout << endl;
f = str.saca();
cout << "First In First Out String: " << f << endl;
cout << endl;
flo.print();
cout << endl;
str.print();
cout << "Hello world!" << endl;
return 0;
}
Mais quand je compiler, le compilateur renvoie des erreurs dans chaque instance de la classe de modèle:
undefined reference to `cola(float)::cola()'... (c'est en fait cola'<'float'>'::cola(), mais cela ne me permet pas de l'utiliser comme ça).
Et ainsi de suite. Au total, 17 avertissements, en comptant ceux pour les fonctions de membre d'être appelé dans le programme.
Pourquoi est-ce? Ces fonctions et les constructeurs ONT été définis. Je pensais que le compilateur peut remplacer le "T" dans le modèle avec "float", "string" ou que ce soit; c'est l'avantage de l'utilisation de modèles.
J'ai lu quelque part ici que je devrais mettre la déclaration de chaque fonction dans le fichier d'en-tête pour une raison quelconque. Est ce que le droit? Et si oui, pourquoi?
Merci à l'avance.