|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
J'ai écrit un petit programme de manipulation de matrices en gabarit, patron (template) qui ne compile pas. J'aimerais bien comprendre le message d'erreur sur Vecteur<T, C> & Vecteur<T, C>: perator = ( Vecteur<T, C> &) qui me ditno match for 'operator=' in 'v = Vecteur<T, C>: perator * (T)Ce programme compile sous VS2003 mais signale un warning "étendu..." Je voudrais comprendre et utiliser g++ ;-) vec.h est le fichier de définition des classes v2.cpp le petit programme de test. Merci. Gilles DRIDI http://cdridi.club.fr |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Bonsoir, à propos des templates pour les débutants avec G++
Le compilo ne fournit pas un message clair signifiant qu'il s'agit d'un problème de const mais ... Ce qu'il faut savoir : c'est qu'un objet temporaire est toujours const. Donc, l'objet temporaire à droite du signe égal est const : c'est le résultat de l'addition Il faut encore modifié l'operateur d'affectation pour qu'il prenne un const ainsi que le constructeur de recopie. Finesse suprême, il faut que l'opérateur d'accès soit définit const : operateur [] (long i) const { return tab[i]; } Avec le const à cette place là cela veut dire que la fonction ne modifie pas l'état des membres de l'objet. Voilà un complément d'information pour ceux qui ne maîtrise pas les template. Gilles DRIDI http://cdridi.club.fr "Gilles DRIDI" <gdridi@club-internet.fr> a écrit dans le message de news: 47cb0dfe$0$21145$7a628cd7@news.club-internet.fr... > Bonjour, > > J'ai écrit un petit programme de manipulation de matrices en gabarit, > patron (template) > qui ne compile pas. > J'aimerais bien comprendre le message d'erreur sur Vecteur<T, C> & > Vecteur<T, C>: perator = ( Vecteur<T, C> &) qui me dit> no match for 'operator=' in 'v = Vecteur<T, C>: perator * (T)> > Ce programme compile sous VS2003 mais signale un warning "étendu..." > > Je voudrais comprendre et utiliser g++ ;-) > > vec.h est le fichier de définition des classes > v2.cpp le petit programme de test. > > Merci. > Gilles DRIDI > http://cdridi.club.fr > > |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On Sat, 8 Mar 2008 22:10:00 +0100, "Gilles DRIDI"
<gdridi@club-internet.fr>: >Avec le const à cette place là cela veut dire que la fonction ne modifie pas >l'état des membres de l'objet. Plus précisément, une fonction qui ne modifie pas l'objet *doit* être déclarée const, quel que soit le contexte. |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
On 8 mar, 22:10, "Gilles DRIDI" <gdr...@club-internet.fr> wrote:
> Bonsoir, à propos des templates pour les débutants avec G++ > Le compilo ne fournit pas un message clair signifiant qu'il > s'agit d'un problème de const mais ... > Ce qu'il faut savoir : c'est qu'un objet temporaire est > toujours const. Non. Un object temporaire n'est const que si on l'a déclaré const, par exemple, la valeur de retour de : MaClasse const f() ; Sinon, il n'est pas const. Et la façon la plus courante d'obtenir un temporaire, MaClasse(), ne permet pas le const. > Donc, l'objet temporaire à droite du signe égal est const : > c'est le résultat de l'addition. Ce n'est pas forcement une mauvaise idée de déclarer la valeur de retour d'un operator+ const, mais j'ai bien vu pas mal du code où ce n'était pas le cas. (Dont les miens, d'ailleurs.) > Il faut encore modifié l'operateur d'affectation pour qu'il > prenne un const ainsi que le constructeur de recopie. À vrai dire... Il faut les déclarer à prendre les références à const dès le début. (Donc, pas de modification.) Sauf, peut-être, l'opérateur d'affectation, où certains (pas moi) préfèrent le faire prendre le paramètre par valeur. Je dirais que tout celà fasse partie du b a ba de C++, et doit être expliqué dans n'importe quel livre de base. Aussi, même si le temporaire n'est pas const, il y a une règle qui dit qu'une référence à non-const ne peut pas être initialisée par un temporaire. Règle qui ne s'applique pas aux fonctions membre. (Mais il y a encore une autre règle qui fait que les résultats des conversions implicites ne sont pas considérés pour le paramètre this dans la résolution du surcharge.) Donc, si tu déclares l'opérateur + comme membre, avec un paramètre référence à non-const, tu peux bien utiliser un temporaire pour la côté gauche, mais pas pour la côté droit. Et les conversions implicites ne seront jamais prises en compte, à gauche, parce qu'on ne les considère pas pour le paramètre this, et à droite, parce que le résultat d'une conversion est un temporaire, qui ne peut pas servir à initialiser une référence à non-const. Que tu le déclares membre, avec un paramètre référence à const, les conversions implicites ne seront pas prises en compte à gauche, mais marcheront bien à droite. Que tu le déclares non-membre, avec les références à const pour les deux paramètres, et on peut se servir des conversions et d'autres temporaires et à droite et à gauche. C'est l'idiome consacré. > Finesse suprême, il faut que l'opérateur d'accès soit définit > const : > operateur [] (long i) const { return tab[i]; } > Avec le const à cette place là cela veut dire que la fonction > ne modifie pas l'état des membres de l'objet. Normallement, on en déclare deux. Un const, et l'autre non. Celui const renvoie soit un objet (temporaire), soit, plus souvent, une référence à const. Celui non-const renvoie une référence non-const, qui permet la modification de l'élément. -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
On 8 mar, 22:33, Fabien LE LEZ <grams...@gramster.com> wrote:
> On Sat, 8 Mar 2008 22:10:00 +0100, "Gilles DRIDI" > <gdr...@club-internet.fr>: > >Avec le const à cette place là cela veut dire que la fonction > >ne modifie pas l'état des membres de l'objet. > Plus précisément, une fonction qui ne modifie pas l'objet *doit* être > déclarée const, quel que soit le contexte. Du point de vue de la conception, peut-être. Du point de vue du langage, c'est l'inverse : une fonction déclarée const ne doit pas modifier l'objet. (Modulo mutable et const_cast, évidemment.) -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
![]() |
| Outils de la discussion | |
|
|