Bonjour,
Il y a une discussion sur fclc++ initiée par Samuel Krempp (coucou
Samuel) au sujet de la nécessité d'écrire certaines fonctions deux
fois, une fois en const et une fois non-const.
http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread/da5a0572c66e5ce8/8ed30a99cd556789
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
Bonjour,
Il y a une discussion sur fclc++ initiée par Samuel Krempp (coucou
Samuel) au sujet de la nécessité d'écrire certaines fonctions deux
fois, une fois en const et une fois non-const.
http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread/da5a0572c66e5ce8/8ed30a99cd556789
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
Bonjour,
Il y a une discussion sur fclc++ initiée par Samuel Krempp (coucou
Samuel) au sujet de la nécessité d'écrire certaines fonctions deux
fois, une fois en const et une fois non-const.
http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread/da5a0572c66e5ce8/8ed30a99cd556789
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
[...] Mais je ne vois pas en quoi le cast automatique
pourrait compromettre la sécurité de l'application.
[...] Mais je ne vois pas en quoi le cast automatique
pourrait compromettre la sécurité de l'application.
[...] Mais je ne vois pas en quoi le cast automatique
pourrait compromettre la sécurité de l'application.
C'est étrange, je suis obligé en quelque sorte d'oublier une bonne
propriété de mon implémentation (un invariant) pour pouvoir
implémenter l'interface. C'est en quelque sorte contraire au principe
"qui peut le plus, peut le moins" et au fait que les "const" quand ils
sont raisonnables sont une bonne pratique.
C'est étrange, je suis obligé en quelque sorte d'oublier une bonne
propriété de mon implémentation (un invariant) pour pouvoir
implémenter l'interface. C'est en quelque sorte contraire au principe
"qui peut le plus, peut le moins" et au fait que les "const" quand ils
sont raisonnables sont une bonne pratique.
C'est étrange, je suis obligé en quelque sorte d'oublier une bonne
propriété de mon implémentation (un invariant) pour pouvoir
implémenter l'interface. C'est en quelque sorte contraire au principe
"qui peut le plus, peut le moins" et au fait que les "const" quand ils
sont raisonnables sont une bonne pratique.
Il y a une discussion sur fclc++ initiée par Samuel Krempp (coucou
Samuel) au sujet de la nécessité d'écrire certaines fonctions deux
fois, une fois en const et une fois non-const.
http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread/da5a0572c66e5ce8/8ed30a99cd556789
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
Il y a une discussion sur fclc++ initiée par Samuel Krempp (coucou
Samuel) au sujet de la nécessité d'écrire certaines fonctions deux
fois, une fois en const et une fois non-const.
http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread/da5a0572c66e5ce8/8ed30a99cd556789
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
Il y a une discussion sur fclc++ initiée par Samuel Krempp (coucou
Samuel) au sujet de la nécessité d'écrire certaines fonctions deux
fois, une fois en const et une fois non-const.
http://groups.google.com/group/fr.comp.lang.c++/browse_thread/thread/da5a0572c66e5ce8/8ed30a99cd556789
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple
dans mon cas particulier, je dérive d'une classe abstraite qui
demande une fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent
pas (et du coup que ma classe reste virtuelle) et tout ce
corrige dès que j'enlève le const de l'implémentation. Mais je
ne vois pas en quoi le cast automatique pourrait compromettre
la sécurité de l'application.
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple
dans mon cas particulier, je dérive d'une classe abstraite qui
demande une fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent
pas (et du coup que ma classe reste virtuelle) et tout ce
corrige dès que j'enlève le const de l'implémentation. Mais je
ne vois pas en quoi le cast automatique pourrait compromettre
la sécurité de l'application.
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple
dans mon cas particulier, je dérive d'une classe abstraite qui
demande une fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le compilateur (GCC) dit que les signatures ne correspondent
pas (et du coup que ma classe reste virtuelle) et tout ce
corrige dès que j'enlève le const de l'implémentation. Mais je
ne vois pas en quoi le cast automatique pourrait compromettre
la sécurité de l'application.
writes:
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le problème ici, c'est GraphInterface qui ne fournit pas une interface
respectant const à implémenter.
Evidemment, quand tu essaies de le faire
tu as des problèmes.
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
A mon avis, il y a déjà trop de possibilités de conversions implici tes en
C++ pour qu'on en ajoute encore. Et ici, je ne vois pas quand tu veux la
conversion implicite, j'ai plutôt l'impression que tu veux une défini tion
de fonction implicite.
Dans le cas où la fonction est virtuelle pure, on peut le comprendre --
même si je n'aime pas trop ce "do what I mean", ça me semble passé de mode
dans la conception des langages depuis les années 70 --, mais si elle e st
simplement virtuelle, est-ce que tu le voudrais aussi? Si oui, tu veux
donc imposer au gens de supplanter une fonction pour en refournir
immédiatement une implémentation équivalente à celle qui existe d ans les
cas où la version de la classe parent est la bonne; si non, pourquoi la
différence entre le cas pure et le cas non pure?
diego-olivier.fernandez-pons@cicrp.jussieu.fr writes:
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le problème ici, c'est GraphInterface qui ne fournit pas une interface
respectant const à implémenter.
Evidemment, quand tu essaies de le faire
tu as des problèmes.
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
A mon avis, il y a déjà trop de possibilités de conversions implici tes en
C++ pour qu'on en ajoute encore. Et ici, je ne vois pas quand tu veux la
conversion implicite, j'ai plutôt l'impression que tu veux une défini tion
de fonction implicite.
Dans le cas où la fonction est virtuelle pure, on peut le comprendre --
même si je n'aime pas trop ce "do what I mean", ça me semble passé de mode
dans la conception des langages depuis les années 70 --, mais si elle e st
simplement virtuelle, est-ce que tu le voudrais aussi? Si oui, tu veux
donc imposer au gens de supplanter une fonction pour en refournir
immédiatement une implémentation équivalente à celle qui existe d ans les
cas où la version de la classe parent est la bonne; si non, pourquoi la
différence entre le cas pure et le cas non pure?
writes:
Ce que je ne comprends pas est pourquoi C++ ne peut pas caster
automatiquement une fonction const en non-const. Par exemple dans mon
cas particulier, je dérive d'une classe abstraite qui demande une
fonction non-const.
class GraphInterface {
virtual int get_number_of_nodes () = 0;
}
et ma classe concrète définit
int get_number_of_nodes () const { return number_of_nodes; }
Le problème ici, c'est GraphInterface qui ne fournit pas une interface
respectant const à implémenter.
Evidemment, quand tu essaies de le faire
tu as des problèmes.
Le compilateur (GCC) dit que les signatures ne correspondent pas (et du
coup que ma classe reste virtuelle) et tout ce corrige dès que
j'enlève le const de l'implémentation. Mais je ne vois pas en quoi le
cast automatique pourrait compromettre la sécurité de l'application.
A mon avis, il y a déjà trop de possibilités de conversions implici tes en
C++ pour qu'on en ajoute encore. Et ici, je ne vois pas quand tu veux la
conversion implicite, j'ai plutôt l'impression que tu veux une défini tion
de fonction implicite.
Dans le cas où la fonction est virtuelle pure, on peut le comprendre --
même si je n'aime pas trop ce "do what I mean", ça me semble passé de mode
dans la conception des langages depuis les années 70 --, mais si elle e st
simplement virtuelle, est-ce que tu le voudrais aussi? Si oui, tu veux
donc imposer au gens de supplanter une fonction pour en refournir
immédiatement une implémentation équivalente à celle qui existe d ans les
cas où la version de la classe parent est la bonne; si non, pourquoi la
différence entre le cas pure et le cas non pure?
Le C++ supporte la covariance, mais non la contravariance.
Donc :
T const* Base::f() ;
peut être supplantée par :
T* Derived::f() ;
mais :
void Base::f( T* ) ;
ne peut pas être supplantée par :
void Derived::f( T const* ) ;
Le C++ supporte la covariance, mais non la contravariance.
Donc :
T const* Base::f() ;
peut être supplantée par :
T* Derived::f() ;
mais :
void Base::f( T* ) ;
ne peut pas être supplantée par :
void Derived::f( T const* ) ;
Le C++ supporte la covariance, mais non la contravariance.
Donc :
T const* Base::f() ;
peut être supplantée par :
T* Derived::f() ;
mais :
void Base::f( T* ) ;
ne peut pas être supplantée par :
void Derived::f( T const* ) ;
kanze :Le C++ supporte la covariance, mais non la contravariance.
Donc :
T const* Base::f() ;
peut être supplantée par :
T* Derived::f() ;
mais :
void Base::f( T* ) ;
ne peut pas être supplantée par :
void Derived::f( T const* ) ;
Une question sur la covariance :
apparemment,
double Base::f()
ne peut être supplantée par
int Derived::f()
Pourquoi ? N'a-t-on pas int <= double ?
kanze <kanze@gabi-soft.fr> :
Le C++ supporte la covariance, mais non la contravariance.
Donc :
T const* Base::f() ;
peut être supplantée par :
T* Derived::f() ;
mais :
void Base::f( T* ) ;
ne peut pas être supplantée par :
void Derived::f( T const* ) ;
Une question sur la covariance :
apparemment,
double Base::f()
ne peut être supplantée par
int Derived::f()
Pourquoi ? N'a-t-on pas int <= double ?
kanze :Le C++ supporte la covariance, mais non la contravariance.
Donc :
T const* Base::f() ;
peut être supplantée par :
T* Derived::f() ;
mais :
void Base::f( T* ) ;
ne peut pas être supplantée par :
void Derived::f( T const* ) ;
Une question sur la covariance :
apparemment,
double Base::f()
ne peut être supplantée par
int Derived::f()
Pourquoi ? N'a-t-on pas int <= double ?
Pourquoi ? N'a-t-on pas int <= double ?
Ça veut dire quoi, <= ici ?
Pour que la covariance soit légale, il faut qu'il y a un rapport
sur le système des types ; double et int sont bien deux types
distincts et non-apparentés. Le fait qu'il y a une conversion
possible ne rend pas possible la covariance. (En fait, en C++,
la covariance ne fonctionne qu'avec des références ou des
pointeurs. Et les conversions permises sont, grosso modo, celui
de Base* vers Derived* et de T cv1* vers T cv2*, où cv2 est un
sous-ensemble de cv1.)
Pourquoi ? N'a-t-on pas int <= double ?
Ça veut dire quoi, <= ici ?
Pour que la covariance soit légale, il faut qu'il y a un rapport
sur le système des types ; double et int sont bien deux types
distincts et non-apparentés. Le fait qu'il y a une conversion
possible ne rend pas possible la covariance. (En fait, en C++,
la covariance ne fonctionne qu'avec des références ou des
pointeurs. Et les conversions permises sont, grosso modo, celui
de Base* vers Derived* et de T cv1* vers T cv2*, où cv2 est un
sous-ensemble de cv1.)
Pourquoi ? N'a-t-on pas int <= double ?
Ça veut dire quoi, <= ici ?
Pour que la covariance soit légale, il faut qu'il y a un rapport
sur le système des types ; double et int sont bien deux types
distincts et non-apparentés. Le fait qu'il y a une conversion
possible ne rend pas possible la covariance. (En fait, en C++,
la covariance ne fonctionne qu'avec des références ou des
pointeurs. Et les conversions permises sont, grosso modo, celui
de Base* vers Derived* et de T cv1* vers T cv2*, où cv2 est un
sous-ensemble de cv1.)