le programme suivant génère une erreur à la compilation
(avec VC6). Que faut il que je fasse pour pouvoir faire
jouer le polymorphisme ? Le but est d'ensuite faire un
vecteur (ou autre conteneur) de pointeurs de LaMere et
d'y mettre des pointeurs de LeFils avec plusieurs T.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien LE LEZ
On Sat, 10 Dec 2005 20:20:11 +0100, "Etienne Rousee" :
Subject: Template
Mauvais sujet, ton problème n'a rien à voir avec les templates.
le programme suivant génère une erreur à la compilation (avec VC6). Que faut il que je fasse pour pouvoir faire jouer le polymorphisme ? Le but est d'ensuite faire un
vecteur
vector. Ou "tableau", si tu préfères. Un vecteur est un objet mathématique aux propriétés assez différentes.
Ça ne marche pas, et il n'y a aucun moyen de faire ça, car "<<" ne peut pas être membre. Ce type de polymorphisme ne fonctionne qu'avec les fonctions virtuelles.
Ce que tu peux faire :
//template<class T> /* Je le mets en commentaire car ça n'a rien à voir avec le problème. */
On Sat, 10 Dec 2005 20:20:11 +0100, "Etienne Rousee"
<etienne@rousee.org>:
Subject: Template
Mauvais sujet, ton problème n'a rien à voir avec les templates.
le programme suivant génère une erreur à la compilation
(avec VC6). Que faut il que je fasse pour pouvoir faire
jouer le polymorphisme ? Le but est d'ensuite faire un
vecteur
vector.
Ou "tableau", si tu préfères.
Un vecteur est un objet mathématique aux propriétés assez différentes.
Ça ne marche pas, et il n'y a aucun moyen de faire ça, car "<<" ne
peut pas être membre.
Ce type de polymorphisme ne fonctionne qu'avec les fonctions
virtuelles.
Ce que tu peux faire :
//template<class T> /* Je le mets en commentaire car ça n'a rien à
voir avec le problème. */
On Sat, 10 Dec 2005 20:20:11 +0100, "Etienne Rousee" :
Subject: Template
Mauvais sujet, ton problème n'a rien à voir avec les templates.
le programme suivant génère une erreur à la compilation (avec VC6). Que faut il que je fasse pour pouvoir faire jouer le polymorphisme ? Le but est d'ensuite faire un
vecteur
vector. Ou "tableau", si tu préfères. Un vecteur est un objet mathématique aux propriétés assez différentes.
Ça ne marche pas, et il n'y a aucun moyen de faire ça, car "<<" ne peut pas être membre. Ce type de polymorphisme ne fonctionne qu'avec les fonctions virtuelles.
Ce que tu peux faire :
//template<class T> /* Je le mets en commentaire car ça n'a rien à voir avec le problème. */
On Sat, 10 Dec 2005 20:20:11 +0100, "Etienne Rousee" :
Subject: Template
Mauvais sujet, ton problème n'a rien à voir avec les templates.
le programme suivant génère une erreur à la compilation (avec VC6). Que faut il que je fasse pour pouvoir faire jouer le polymorphisme ? Le but est d'ensuite faire un
vecteur
vector. Ou "tableau", si tu préfères. Un vecteur est un objet mathématique aux propriétés assez différentes.
Oui, je me suis mal exprimé, quand je dis "vecteur" en français, je pensais bien sûr au conteneur "vector" de la STL, de la même façon que je pourrais parler d'une boucle "tant que". Si le contexte était mathématique, je prendrais d'autres précautions.
Ça ne marche pas, et il n'y a aucun moyen de faire ça, car "<<" ne peut pas être membre. Ce type de polymorphisme ne fonctionne qu'avec les fonctions virtuelles.
cout << endl; for (it = LeVecteur.begin(); it != LeVecteur.end(); it++) cout << **it;
return EXIT_SUCCESS; }
"Fabien LE LEZ" <gramster@gramster.com> a écrit ...
On Sat, 10 Dec 2005 20:20:11 +0100, "Etienne Rousee"
<etienne@rousee.org>:
Subject: Template
Mauvais sujet, ton problème n'a rien à voir avec les templates.
le programme suivant génère une erreur à la compilation
(avec VC6). Que faut il que je fasse pour pouvoir faire
jouer le polymorphisme ? Le but est d'ensuite faire un
vecteur
vector.
Ou "tableau", si tu préfères.
Un vecteur est un objet mathématique aux propriétés assez différentes.
Oui, je me suis mal exprimé, quand je dis "vecteur" en français,
je pensais bien sûr au conteneur "vector" de la STL, de la même
façon que je pourrais parler d'une boucle "tant que".
Si le contexte était mathématique, je prendrais d'autres précautions.
Ça ne marche pas, et il n'y a aucun moyen de faire ça, car "<<" ne
peut pas être membre.
Ce type de polymorphisme ne fonctionne qu'avec les fonctions
virtuelles.
On Sat, 10 Dec 2005 20:20:11 +0100, "Etienne Rousee" :
Subject: Template
Mauvais sujet, ton problème n'a rien à voir avec les templates.
le programme suivant génère une erreur à la compilation (avec VC6). Que faut il que je fasse pour pouvoir faire jouer le polymorphisme ? Le but est d'ensuite faire un
vecteur
vector. Ou "tableau", si tu préfères. Un vecteur est un objet mathématique aux propriétés assez différentes.
Oui, je me suis mal exprimé, quand je dis "vecteur" en français, je pensais bien sûr au conteneur "vector" de la STL, de la même façon que je pourrais parler d'une boucle "tant que". Si le contexte était mathématique, je prendrais d'autres précautions.
Ça ne marche pas, et il n'y a aucun moyen de faire ça, car "<<" ne peut pas être membre. Ce type de polymorphisme ne fonctionne qu'avec les fonctions virtuelles.
class LaMere { public: virtual void print (ostream&) = 0;
Pareil ici virtual void print (ostream&) const = 0; et partout ailleurs où il s'agit de sortir des objets - le fait d'imprimer quelque chose ne doit d'habitude pas modifier cette chose et c'est bien de le faire vérifier par le compilateur.
Au fait, cet opérateur n'est plus nécessaire à partir du moment où ostream& operator<<(ostream&, LaMere const&); existe et fait appel à la fonction membre virtuelle "print(ostream&) const" qui est redéfinie dans les classes "LeFils<T>".
[...]
int main(void) { vector <LaMere *> LeVecteur; vector <LaMere *>::iterator it; Je supprimerais cette définition ici...
cout << endl; for (it = LeVecteur.begin(); it != LeVecteur.end(); it++) ... pour définir "it" ici comme étant un "vector<LaMere *>::const_iterator".
cout << **it;
return EXIT_SUCCESS; }
Puis dans le programme réel, il faudra s'occuper de la durée de vie des objets crées avec "new" : - ne pas oublier le destructeur virtuel dans "LaMere", - faire des "delete" quand il faut - le plus simple et le plus sûr, c'est de les laisser faire par quelque chose comme "boost::shared_ptr".
class LaMere
{
public:
virtual void print (ostream&) = 0;
Pareil ici
virtual void print (ostream&) const = 0;
et partout ailleurs où il s'agit de sortir des objets -
le fait d'imprimer quelque chose ne doit d'habitude pas
modifier cette chose et c'est bien de le faire vérifier
par le compilateur.
Au fait, cet opérateur n'est plus nécessaire à partir du moment où
ostream& operator<<(ostream&, LaMere const&);
existe et fait appel à la fonction membre virtuelle "print(ostream&) const"
qui est redéfinie dans les classes "LeFils<T>".
[...]
int main(void)
{
vector <LaMere *> LeVecteur;
vector <LaMere *>::iterator it;
Je supprimerais cette définition ici...
cout << endl;
for (it = LeVecteur.begin(); it != LeVecteur.end(); it++)
... pour définir "it" ici comme étant un "vector<LaMere *>::const_iterator".
cout << **it;
return EXIT_SUCCESS;
}
Puis dans le programme réel, il faudra s'occuper de la durée de vie des
objets crées avec "new" :
- ne pas oublier le destructeur virtuel dans "LaMere",
- faire des "delete" quand il faut - le plus simple et le plus sûr,
c'est de les laisser faire par quelque chose comme "boost::shared_ptr".
class LaMere { public: virtual void print (ostream&) = 0;
Pareil ici virtual void print (ostream&) const = 0; et partout ailleurs où il s'agit de sortir des objets - le fait d'imprimer quelque chose ne doit d'habitude pas modifier cette chose et c'est bien de le faire vérifier par le compilateur.
Au fait, cet opérateur n'est plus nécessaire à partir du moment où ostream& operator<<(ostream&, LaMere const&); existe et fait appel à la fonction membre virtuelle "print(ostream&) const" qui est redéfinie dans les classes "LeFils<T>".
[...]
int main(void) { vector <LaMere *> LeVecteur; vector <LaMere *>::iterator it; Je supprimerais cette définition ici...
cout << endl; for (it = LeVecteur.begin(); it != LeVecteur.end(); it++) ... pour définir "it" ici comme étant un "vector<LaMere *>::const_iterator".
cout << **it;
return EXIT_SUCCESS; }
Puis dans le programme réel, il faudra s'occuper de la durée de vie des objets crées avec "new" : - ne pas oublier le destructeur virtuel dans "LaMere", - faire des "delete" quand il faut - le plus simple et le plus sûr, c'est de les laisser faire par quelque chose comme "boost::shared_ptr".
Falk
Etienne Rousee
"Falk Tannhäuser" a écrit ...
Oui, tu as raison. Je voulais d'abord trouver le moyen de faire ce que je voulais avant de le peaufiner pour le faire proprement.
--
Etienne
"Falk Tannhäuser" <tannhauser86549spam@free.fr> a écrit ...
Oui, tu as raison.
Je voulais d'abord trouver le moyen de faire ce que je voulais
avant de le peaufiner pour le faire proprement.
Au fait, cet opérateur n'est plus nécessaire à partir du moment où ostream& operator<<(ostream&, LaMere const&); existe et fait appel à la fonction membre virtuelle "print(ostream&) const"
qui est redéfinie dans les classes "LeFils<T>".
Et pourtant si. En le mettant en commentaire, ça ne marche plus (erreur compilation).
--
Etienne
"Falk Tannhäuser" <tannhauser86549spam@free.fr> a écrit ...
Au fait, cet opérateur n'est plus nécessaire à partir du moment où
ostream& operator<<(ostream&, LaMere const&);
existe et fait appel à la fonction membre virtuelle "print(ostream&)
const"
qui est redéfinie dans les classes "LeFils<T>".
Et pourtant si.
En le mettant en commentaire, ça ne marche plus (erreur compilation).
Au fait, cet opérateur n'est plus nécessaire à partir du moment où ostream& operator<<(ostream&, LaMere const&); existe et fait appel à la fonction membre virtuelle "print(ostream&) const"
qui est redéfinie dans les classes "LeFils<T>".
Et pourtant si. En le mettant en commentaire, ça ne marche plus (erreur compilation).
--
Etienne
Alexandre
template <class T> class LeFils : public LaMere { public: