Template- au secours

Signaler
Messages postés
91
Date d'inscription
samedi 2 avril 2005
Statut
Membre
Dernière intervention
7 août 2006
-
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
-
bonjour tout le monde,

j'ai un probleme au niveau des templates, ca bloke au niveau du linkage!!

voici la declaration de la classe , et des methodes:



template <class t> class pile

{

public:

pile();

int pilevide();

void empiler(t);

t depiler();

void afficher();

/~pile();



private:

struct liste_pile

{

liste_pile *next;

t val;

};

liste_pile *sommet;

};



template <class t> pile <t>::pile()

{

sommet=NULL;

};

template <class t>

pile <t>::pilevide()

{

return sommet==NULL;

}

template <class t>

void pile <t>::empiler(t elt)

{

liste_pile *p;



p = new liste_pile();

p->val=elt;

p->next=sommet;

sommet=p;

}

template <class t>

t pile <t>::depiler()

{

liste_pile *p;

t elt;



t=sommet->val;

p=sommet;

sommet=sommet-Wnext;

delete p;

}

template <class t>

void pile <t>::afficher()

{

while(!pilevide())

cout<<depiler();

}





au niveau du main:



pile p;





merci bcp

5 réponses

Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010

Et que repond le linker? Tu inclue bien TOUTES les definitions avant ton main?


mayonaise tournera, bientôt, très bientôt...
Messages postés
91
Date d'inscription
samedi 2 avril 2005
Statut
Membre
Dernière intervention
7 août 2006

est c ke j'ai besoin d'inclure une definition pour les templates ? si oui laquelle?

mersi
Messages postés
224
Date d'inscription
mardi 12 août 2003
Statut
Membre
Dernière intervention
18 octobre 2010

Et bien toutes celles que tu utilises en fait. Il n'y a pas à ma connaissance de codage en dur des templates, il faut inclure toute les definitions lors de la compilation. Le mieux c'est de developper les membres de la classe directement dans celle-ci.

template <class t> class pile
{
public:
pile() {
//...
}
int pilevide() {
//...
}
void empiler(t) {
//...
}
t depiler() {
//...
}
void afficher() {
//...
}
~pile(){
//...
}

//...
};


mayonaise tournera, bientôt, très bientôt...
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Compare avec ce que je te mets la, il y avait plusieurs truc qui allaient pas, dont des erreurs de frappe.



template <class t> class pile

{

public:

pile();

int pilevide();

void empiler(t);

t depiler();

void afficher();

~pile() { delete this->sommet; }



private:

struct liste_pile

{

liste_pile *next;

t val;



~liste_pile() { delete this->next; }

};

liste_pile *sommet;

};



template <class t> pile <t>::pile()

{

sommet=NULL;

};

template <class t>

int pile <t>::pilevide()

{

return sommet==NULL;

}

template <class t>

void pile <t>::empiler(t elt)

{

liste_pile *p;



p = new liste_pile();

p->val=elt;

p->next=sommet;

sommet=p;

}

template <class t>

t pile <t>::depiler()

{

liste_pile *p;

t elt;



elt=sommet->val;

p=sommet;

sommet=sommet-sommet->next;

delete p;

}

template <class t>

void pile <t>::afficher()

{

while(!pilevide())

std::cout<<depiler()<<std::flush;

}
Messages postés
475
Date d'inscription
dimanche 3 octobre 2004
Statut
Membre
Dernière intervention
11 août 2006
4
Il manque le corps d'assignation (la classe est fuie), des const, et
afficher() vide la pile (il vaut mieux faire une surcharge de <<
sur ostream).