Classe template C++

Discutez d'informatique ici !
Facteur
Membre Naturel
Messages: 17
Enregistré le: 12 Nov 2007, 18:18

classe template C++

par Facteur » 30 Oct 2009, 21:37

Bonsoir, j'ai programmé une classe pile prenant comme paramètres un entier dim(qui est la taille maximale de la pile), un entier taille(le nombre d'éléments que contient réellement la pile) et un pointeur d'entier *adr(qui va pointer sur le premier élément de mon tableau).

J'associe à cette classe plusieurs méthodes :

pile(int t=10); // Constructeur
pile(const pile &); // Constructeur de copie
~pile(); //Destructeur
void empile(int); //Empile l'entier en haut de la pile
int depile(); //Depile le sommet de la pile et renvoi l'élément enlevé
int vide() const; //Test si la pile est vide
int pleine() const; // Teste si la pile est pleine
int donnetaille() const; //Renvoi la taille de la pile
void affiche();//Affichage de ma pile

Je sépare mon programme en trois : un fichier pile.h, un pile.cpp et un main.cpp. Mon programme principal crée une pile et l'affiche, il n'a pas d'erreurs et fonctionne comme je le souhaite.
Maintenant je veux remplacer ma pile d'entier par une pile de type T et là c'est le drame...
J'obtiens plusieurs fois la même erreur, je n'ai encore jamais utilisé la classe template c'est surement une erreur de syntaxe. Pouvez vous m'aider a la trouver ? merci

Voici mon code :
-pile_t.h:
#ifndef pile_h
#define pile_h

template
class pile
{
private :
int dim;
int taille;
T * adr;

public :
pile(int t=10);
pile(const pile &);
~pile();
void empile(T);
T depile();
int vide()const;
int pleine()const;
int donnetaille()const;
void affiche();
//friend ostream & operator
using namespace std;
#include "pile_t.h"


template
pile::pile(int t)
{
taille=0;
dim=t;
adr=new T [dim];
}

template
pile::pile(const pile & P)
{
cout 0)
{
for(int i=0; i
pile::~pile()
{
cout
void pile::empile(T a)
{
if(taille
T pile::depile()
{
if(taille==0)
{
cout
int pile::vide() const
{
if(taille==0)
return 0;
else return 1;
}

template
int pile::pleine() const
{
if(taille==dim)
return 0;
else return 1;
}

template
int pile::donnetaille() const
{
return taille;
}

template
void pile::affiche()
{
if(taille>0)
{
for(int i=0; i
ostream & operator
using namespace std;
#include "pile_t.h"

int main()
{
int t,b;
float a;
cout > t;
pile A(t);
cout > t;
for(int i=0; i> a;
A.empile(a);
}
//cout > t;
pile B(t);
cout > t;
for(int i=0; i> b;
B.empile(b);
}
//cout ::~pile(void)" (??1?$pile@M@@QAE@XZ) référencé dans la fonction _main
main_t.obj : error LNK2019: symbole externe non résolu "public: __thiscall pile::~pile(void)" (??1?$pile@H@@QAE@XZ) référencé dans la fonction _main
main_t.obj : error LNK2019: symbole externe non résolu "public: void __thiscall pile::affiche(void)" (?affiche@?$pile@H@@QAEXXZ) référencé dans la fonction _main
main_t.obj : error LNK2019: symbole externe non résolu "public: void __thiscall pile::empile(int)" (?empile@?$pile@H@@QAEXH@Z) référencé dans la fonction _main
main_t.obj : error LNK2019: symbole externe non résolu "public: __thiscall pile::pile(int)" (??0?$pile@H@@QAE@H@Z) référencé dans la fonction _main
main_t.obj : error LNK2019: symbole externe non résolu "public: void __thiscall pile::affiche(void)" (?affiche@?$pile@M@@QAEXXZ) référencé dans la fonction _main
main_t.obj : error LNK2019: symbole externe non résolu "public: void __thiscall pile::empile(float)" (?empile@?$pile@M@@QAEXM@Z) référencé dans la fonction _main
main_t.obj : error LNK2019: symbole externe non résolu "public: __thiscall pile::pile(int)" (??0?$pile@M@@QAE@H@Z) référencé dans la fonction _main
C:\Documents and Settings\petit\Bureau\migs\C++\pile_template\Debug\pile_template.exe : fatal error LNK1120: 8 externes non résolus
Le journal de génération a été enregistré à l'emplacement "file://c:\Documents and Settings\petit\Bureau\migs\C++\pile_template\Debug\BuildLog.htm"
pile_template - 9 erreur(s), 0 avertissement(s)


Voilà merci de votre aide.


Ps : J'ai mis l'opérateur << en commentaire parce qu'à la compilation j'avais une autre(une seule) erreur :
pile_t.cpp
c:\documents and settings\...\pile_template\pile_t.cpp(96) : error C2955: 'pile'*: l'utilisation d'une classe modèle requiert une liste d'arguments modèle
c:\documents and settings\...\pile_template\pile_t.h(6)*: voir la déclaration de 'pile'
main_t.cpp



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 30 Oct 2009, 21:52

salut,

je parierais bien sur un prob d'edition des liens
la vie est une fête :)

Facteur
Membre Naturel
Messages: 17
Enregistré le: 12 Nov 2007, 18:18

par Facteur » 03 Nov 2009, 21:35

Salut, désolé pour le temps de réaction, il n'y a pas d'erreur dans mon code, le problème vient du fait qu'il faut fusionner les fichier pile.h et pile.cpp en un seul fichier .h lors de l'utilisation des templates.
Merci de ton aide :++:

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 04 Nov 2009, 06:25

e problème vient du fait qu'il faut fusionner les fichier pile.h et pile.cpp en un seul fichier .h


Pe qu'on dit la même chose. Tu peux sinon mettre un #include fichier.tpp dans ton fichier.h
cqui permet de séparer les déclarations des définitions.
la vie est une fête :)

Facteur
Membre Naturel
Messages: 17
Enregistré le: 12 Nov 2007, 18:18

par Facteur » 04 Nov 2009, 23:01

Effectivement ça marche aussi, je viens de le tester ;)
Par contre je n'aime pas trop, parce que les fichiers .tpp sont inconnus auprès de visual c++ du coup ça m'affiche tout le code du .tpp en noir ce qui est moins lisible. Mais le résultat est le même !
Merci :++:

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 04 Nov 2009, 23:04

avec plaisir :-).

Une autre possibilité, c'est de laisser le fichier .cpp.
Tu trouves le makefile généré par visual C++, et tu modifies la règle qui dit de compiler le fameux fichier .cpp. J'ai pas testé, mais ca devrait marcher !
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 12 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite