le code suivant qui permet de manipuler des classes template avec pour
paramètre une classe abstraite (via une référence bien sur) est-il à
votre avis conforme au standard C++
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
giova
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a prendre au conditionnel, au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
Mathieu Peyréga wrote:
Bonjour,
le code suivant qui permet de manipuler des classes template avec pour paramètre une classe abstraite (via une référence bien sur) est-il à votre avis conforme au standard C++
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais
j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a
prendre au conditionnel, au pire si tu utilise visual qui d'apres mon
formateur est le compilateur le plus a la norme, tu peux mettre le
niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir
lors de ma formation, (exepté que tu utilise vector qui fait parti de la
STL et non du C++ traditionnel).
Mathieu Peyréga wrote:
Bonjour,
le code suivant qui permet de manipuler des classes template avec pour
paramètre une classe abstraite (via une référence bien sur) est-il à
votre avis conforme au standard C++
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a prendre au conditionnel, au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
Mathieu Peyréga wrote:
Bonjour,
le code suivant qui permet de manipuler des classes template avec pour paramètre une classe abstraite (via une référence bien sur) est-il à votre avis conforme au standard C++
au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
Heu, de quelle version parlait-il ? Vous a-t-il parlé de Commeau ?
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
<vector> fait partie de la norme standard.
A+
Christophe
giova wrote:
[snip]
au pire si tu utilise visual qui d'apres mon
formateur est le compilateur le plus a la norme, tu peux mettre le
niveau d'avertissement au max, ca pourrait te donner des indications.
Heu, de quelle version parlait-il ? Vous a-t-il parlé de Commeau ?
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir
lors de ma formation, (exepté que tu utilise vector qui fait parti de la
STL et non du C++ traditionnel).
au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
Heu, de quelle version parlait-il ? Vous a-t-il parlé de Commeau ?
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
<vector> fait partie de la norme standard.
A+
Christophe
Mathieu Peyréga
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a prendre au conditionnel, au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
Que visual soit le comilateur le plus à la norme m'étonne un peu... A mon avis, gcc et en particulier sa toute dernière version 3.4.0 la respecte beaucoup mieux...
Cela dit, mon propos était plus clairement :
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite... Si je suis bien, c'est ce qui se passe dans mon exemple quand je manipule un ISequence< ISequence<int> > puisque en interne, l'implémentation manipule un std::vector<ISequence<int> > Hors, si j'ai bien compris ce que j'ai lu dans la norme, on ne peut utiliser dans un conteneur STL que des objects qui respectent un certain nombre de contrainte dont être "CopyConstructible" ce qui n'est manifestement pas le cas lorsqu'on a une classe abstraite (à moins que j'ai mal compris le tableau récapitulant les contraintes)
De plus, dans la norme, la signature de la méthode resize de std::vector<T> est :
void resize(size_type new_size, value_type x = T());
et non pas ce qui est implémenté dans visual ou g++ :
void resize(size_type new_size, const value_type& x = T());
En passant sur le fait que l'implémentation gcc et visual me parait plus "intelligente" que la norme dans le sens où elle évite un l'appel du constructeur de recopie.
En gros, j'ai l'impression que mon code (qui compile et linke) ne respecte pas la norme à cause de ce point mais j'aurais aimé avoir d'autres avis.
Cordialement,
Mathieu
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais
j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a
prendre au conditionnel, au pire si tu utilise visual qui d'apres mon
formateur est le compilateur le plus a la norme, tu peux mettre le
niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir
lors de ma formation, (exepté que tu utilise vector qui fait parti de la
STL et non du C++ traditionnel).
Que visual soit le comilateur le plus à la norme m'étonne un peu...
A mon avis, gcc et en particulier sa toute dernière version 3.4.0 la
respecte beaucoup mieux...
Cela dit, mon propos était plus clairement :
à t'on le droit d'utiliser un object du type std::vector<IObject> où
IObject est une classe abstraite... Si je suis bien, c'est ce qui se
passe dans mon exemple quand je manipule un ISequence< ISequence<int> >
puisque en interne, l'implémentation manipule un
std::vector<ISequence<int> >
Hors, si j'ai bien compris ce que j'ai lu dans la norme, on ne peut
utiliser dans un conteneur STL que des objects qui respectent un certain
nombre de contrainte dont être "CopyConstructible" ce qui n'est
manifestement pas le cas lorsqu'on a une classe abstraite (à moins que
j'ai mal compris le tableau récapitulant les contraintes)
De plus, dans la norme, la signature de la méthode resize de
std::vector<T> est :
void resize(size_type new_size, value_type x = T());
et non pas ce qui est implémenté dans visual ou g++ :
void resize(size_type new_size, const value_type& x = T());
En passant sur le fait que l'implémentation gcc et visual me parait plus
"intelligente" que la norme dans le sens où elle évite un l'appel du
constructeur de recopie.
En gros, j'ai l'impression que mon code (qui compile et linke) ne
respecte pas la norme à cause de ce point mais j'aurais aimé avoir
d'autres avis.
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a prendre au conditionnel, au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
Que visual soit le comilateur le plus à la norme m'étonne un peu... A mon avis, gcc et en particulier sa toute dernière version 3.4.0 la respecte beaucoup mieux...
Cela dit, mon propos était plus clairement :
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite... Si je suis bien, c'est ce qui se passe dans mon exemple quand je manipule un ISequence< ISequence<int> > puisque en interne, l'implémentation manipule un std::vector<ISequence<int> > Hors, si j'ai bien compris ce que j'ai lu dans la norme, on ne peut utiliser dans un conteneur STL que des objects qui respectent un certain nombre de contrainte dont être "CopyConstructible" ce qui n'est manifestement pas le cas lorsqu'on a une classe abstraite (à moins que j'ai mal compris le tableau récapitulant les contraintes)
De plus, dans la norme, la signature de la méthode resize de std::vector<T> est :
void resize(size_type new_size, value_type x = T());
et non pas ce qui est implémenté dans visual ou g++ :
void resize(size_type new_size, const value_type& x = T());
En passant sur le fait que l'implémentation gcc et visual me parait plus "intelligente" que la norme dans le sens où elle évite un l'appel du constructeur de recopie.
En gros, j'ai l'impression que mon code (qui compile et linke) ne respecte pas la norme à cause de ce point mais j'aurais aimé avoir d'autres avis.
Cordialement,
Mathieu
Loïc Joly
Mathieu Peyréga wrote:
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a prendre au conditionnel, au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
La STL fait partie du C++ à 100%. Maintenant, comme je ne sais pas la signification du mot traditionnel (j'imagine qu'il doit vouloir dire quelquechose de différent pour Gaby et pour James... ;) )
Que visual soit le comilateur le plus à la norme m'étonne un peu... A mon avis, gcc et en particulier sa toute dernière version 3.4.0 la respecte beaucoup mieux...
Quelqu'un a vu des benchs récents ? Les derniers que j'ai vu concernaient VC 6.0 et gcc 2.95.
Cela dit, mon propos était plus clairement :
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite...
Non.
-- Loïc
Mathieu Peyréga wrote:
Vu d'avion ca me semble parfaitement conforme et meme tres propre,
mais j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis
est a prendre au conditionnel, au pire si tu utilise visual qui
d'apres mon formateur est le compilateur le plus a la norme, tu peux
mettre le niveau d'avertissement au max, ca pourrait te donner des
indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir
lors de ma formation, (exepté que tu utilise vector qui fait parti de
la STL et non du C++ traditionnel).
La STL fait partie du C++ à 100%. Maintenant, comme je ne sais pas la
signification du mot traditionnel (j'imagine qu'il doit vouloir dire
quelquechose de différent pour Gaby et pour James... ;) )
Que visual soit le comilateur le plus à la norme m'étonne un peu...
A mon avis, gcc et en particulier sa toute dernière version 3.4.0 la
respecte beaucoup mieux...
Quelqu'un a vu des benchs récents ? Les derniers que j'ai vu
concernaient VC 6.0 et gcc 2.95.
Cela dit, mon propos était plus clairement :
à t'on le droit d'utiliser un object du type std::vector<IObject> où
IObject est une classe abstraite...
Vu d'avion ca me semble parfaitement conforme et meme tres propre, mais j'avoue que tout ca est un peu nouveau pour moi, dpnc mon avis est a prendre au conditionnel, au pire si tu utilise visual qui d'apres mon formateur est le compilateur le plus a la norme, tu peux mettre le niveau d'avertissement au max, ca pourrait te donner des indications.
En tout cas ton code colle parfaitement avec tout ce que j'ai pu voir lors de ma formation, (exepté que tu utilise vector qui fait parti de la STL et non du C++ traditionnel).
La STL fait partie du C++ à 100%. Maintenant, comme je ne sais pas la signification du mot traditionnel (j'imagine qu'il doit vouloir dire quelquechose de différent pour Gaby et pour James... ;) )
Que visual soit le comilateur le plus à la norme m'étonne un peu... A mon avis, gcc et en particulier sa toute dernière version 3.4.0 la respecte beaucoup mieux...
Quelqu'un a vu des benchs récents ? Les derniers que j'ai vu concernaient VC 6.0 et gcc 2.95.
Cela dit, mon propos était plus clairement :
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite...
Non.
-- Loïc
Mathieu Peyréga
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite... Si je suis bien, c'est ce qui se passe dans mon exemple quand je manipule un ISequence< ISequence<int> > puisque en interne, l'implémentation manipule un std::vector<ISequence<int> >
Autant pour moi avec la surcharge, c'est bien le Sequence<Sequence<int>
qui est manipulé... Et l'objet "interdit" que je manipule n'est utilisé qu'au travers d'une
référence et du polymorphisme... En fait, ce code compile si on utilise les STL livrées avec gcc ou visual, mais pas avec la STLPort 4.6.2 pour laquel la signature de la méthode resize est celle de la norme. En effet, à ce moment là, le compilateur qui instancie le template IPathSequence génère une erreur à cause de l'appel du constructeur par défaut qui est bien évidement impossible pourune classe abstraite...
Hors, si j'ai bien compris ce que j'ai lu dans la norme, on ne peut utiliser dans un conteneur STL que des objects qui respectent un certain nombre de contrainte dont être "CopyConstructible" ce qui n'est manifestement pas le cas lorsqu'on a une classe abstraite (à moins que j'ai mal compris le tableau récapitulant les contraintes)
De plus, dans la norme, la signature de la méthode resize de std::vector<T> est :
void resize(size_type new_size, value_type x = T());
et non pas ce qui est implémenté dans visual ou g++ :
void resize(size_type new_size, const value_type& x = T());
En passant sur le fait que l'implémentation gcc et visual me parait plus "intelligente" que la norme dans le sens où elle évite un l'appel du constructeur de recopie.
En gros, j'ai l'impression que mon code (qui compile et linke) ne respecte pas la norme à cause de ce point mais j'aurais aimé avoir d'autres avis.
Cordialement,
Mathieu
à t'on le droit d'utiliser un object du type std::vector<IObject> où
IObject est une classe abstraite... Si je suis bien, c'est ce qui se
passe dans mon exemple quand je manipule un ISequence< ISequence<int> >
puisque en interne, l'implémentation manipule un
std::vector<ISequence<int> >
Autant pour moi avec la surcharge, c'est bien le Sequence<Sequence<int>
qui est manipulé...
Et l'objet "interdit" que je manipule n'est utilisé qu'au travers d'une
référence et du polymorphisme...
En fait, ce code compile si on utilise les STL livrées avec gcc ou
visual, mais pas avec la STLPort 4.6.2 pour laquel la signature de la
méthode resize est celle de la norme.
En effet, à ce moment là, le compilateur qui instancie le template
IPathSequence génère une erreur à cause de l'appel du constructeur par
défaut qui est bien évidement impossible pourune classe abstraite...
Hors, si j'ai bien compris ce que j'ai lu dans la norme, on ne peut
utiliser dans un conteneur STL que des objects qui respectent un certain
nombre de contrainte dont être "CopyConstructible" ce qui n'est
manifestement pas le cas lorsqu'on a une classe abstraite (à moins que
j'ai mal compris le tableau récapitulant les contraintes)
De plus, dans la norme, la signature de la méthode resize de
std::vector<T> est :
void resize(size_type new_size, value_type x = T());
et non pas ce qui est implémenté dans visual ou g++ :
void resize(size_type new_size, const value_type& x = T());
En passant sur le fait que l'implémentation gcc et visual me parait plus
"intelligente" que la norme dans le sens où elle évite un l'appel du
constructeur de recopie.
En gros, j'ai l'impression que mon code (qui compile et linke) ne
respecte pas la norme à cause de ce point mais j'aurais aimé avoir
d'autres avis.
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite... Si je suis bien, c'est ce qui se passe dans mon exemple quand je manipule un ISequence< ISequence<int> > puisque en interne, l'implémentation manipule un std::vector<ISequence<int> >
Autant pour moi avec la surcharge, c'est bien le Sequence<Sequence<int>
qui est manipulé... Et l'objet "interdit" que je manipule n'est utilisé qu'au travers d'une
référence et du polymorphisme... En fait, ce code compile si on utilise les STL livrées avec gcc ou visual, mais pas avec la STLPort 4.6.2 pour laquel la signature de la méthode resize est celle de la norme. En effet, à ce moment là, le compilateur qui instancie le template IPathSequence génère une erreur à cause de l'appel du constructeur par défaut qui est bien évidement impossible pourune classe abstraite...
Hors, si j'ai bien compris ce que j'ai lu dans la norme, on ne peut utiliser dans un conteneur STL que des objects qui respectent un certain nombre de contrainte dont être "CopyConstructible" ce qui n'est manifestement pas le cas lorsqu'on a une classe abstraite (à moins que j'ai mal compris le tableau récapitulant les contraintes)
De plus, dans la norme, la signature de la méthode resize de std::vector<T> est :
void resize(size_type new_size, value_type x = T());
et non pas ce qui est implémenté dans visual ou g++ :
void resize(size_type new_size, const value_type& x = T());
En passant sur le fait que l'implémentation gcc et visual me parait plus "intelligente" que la norme dans le sens où elle évite un l'appel du constructeur de recopie.
En gros, j'ai l'impression que mon code (qui compile et linke) ne respecte pas la norme à cause de ce point mais j'aurais aimé avoir d'autres avis.
Cordialement,
Mathieu
Mathieu Peyréga
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite...
Non.
Au moins c'est clair (et logique vu l'implémentation)... En question subsidiaire : est-ce qu'on a le droit de manipuler un pointeur ou une référence sur un std::vector<IObject> ?
à t'on le droit d'utiliser un object du type std::vector<IObject> où
IObject est une classe abstraite...
Non.
Au moins c'est clair (et logique vu l'implémentation)... En question
subsidiaire :
est-ce qu'on a le droit de manipuler un pointeur ou une référence sur un
std::vector<IObject> ?
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite...
Non.
Au moins c'est clair (et logique vu l'implémentation)... En question subsidiaire : est-ce qu'on a le droit de manipuler un pointeur ou une référence sur un std::vector<IObject> ?
kanze
Mathieu Peyréga wrote in message news:...
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite...
Non.
Au moins c'est clair (et logique vu l'implémentation)...
Il ne s'agissent pas d'une histoire d'implémentation. Un std::vector<IObject> doit contenir des éléments (objets) de type IObject. Si IObject est abstrait, il ne peut pas y avoir d'objets de ce type.
En question subsidiaire : est-ce qu'on a le droit de manipuler un pointeur ou une référence sur un std::vector<IObject> ?
Si IObject est abstrait, il ne peut pas y avoir de type std::vector<IObject>. Donc, pas de pointeurs et pas de références vers un type qui ne peut même pas exister.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Mathieu Peyréga <peyrega@no.spam.netcourrier.com> wrote in message
news:<408D6F36.2010605@no.spam.netcourrier.com>...
à t'on le droit d'utiliser un object du type std::vector<IObject> où
IObject est une classe abstraite...
Non.
Au moins c'est clair (et logique vu l'implémentation)...
Il ne s'agissent pas d'une histoire d'implémentation. Un
std::vector<IObject> doit contenir des éléments (objets) de type
IObject. Si IObject est abstrait, il ne peut pas y avoir d'objets de ce
type.
En question subsidiaire :
est-ce qu'on a le droit de manipuler un pointeur ou une référence sur
un std::vector<IObject> ?
Si IObject est abstrait, il ne peut pas y avoir de type
std::vector<IObject>. Donc, pas de pointeurs et pas de références vers
un type qui ne peut même pas exister.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
à t'on le droit d'utiliser un object du type std::vector<IObject> où IObject est une classe abstraite...
Non.
Au moins c'est clair (et logique vu l'implémentation)...
Il ne s'agissent pas d'une histoire d'implémentation. Un std::vector<IObject> doit contenir des éléments (objets) de type IObject. Si IObject est abstrait, il ne peut pas y avoir d'objets de ce type.
En question subsidiaire : est-ce qu'on a le droit de manipuler un pointeur ou une référence sur un std::vector<IObject> ?
Si IObject est abstrait, il ne peut pas y avoir de type std::vector<IObject>. Donc, pas de pointeurs et pas de références vers un type qui ne peut même pas exister.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34