OVH Cloud OVH Cloud

[newbie] Compilation d'un listing

5 réponses
Avatar
Julien SCORDIA
Bonjour à tous,

J'apprends le C++ à titre personnel, je suis en train de lire le livre de
Stéphane Dupin: "Le langage C++" (J'ai aussi le bouquin de Stroustrup, mais
ce n'est pas la même taille ;-).

Je n'arrive pas à compiler un listing du chapitre 13:

http://julien.scordia.free.fr/p13-3.cpp

Avec g++ 3.4.1 (Linux i586), j'obtiens des messages du type:

p13-3.cpp:105: error: no matching function for call to
`Liste<int>::Ajouter(int)'
p13-3.cpp:41: note: candidates are: int Liste<T>::Ajouter(T&) [with T = int]

Où est le problème, je manque encore de recul.
Merci d'avance,
Julien
--
A world without walls needs neither Windows nor Gates.

5 réponses

Avatar
Loïc Joly
Julien SCORDIA wrote:
Bonjour à tous,

J'apprends le C++ à titre personnel, je suis en train de lire le livre de
Stéphane Dupin: "Le langage C++" (J'ai aussi le bouquin de Stroustrup, mais
ce n'est pas la même taille ;-).

Je n'arrive pas à compiler un listing du chapitre 13:

http://julien.scordia.free.fr/p13-3.cpp

Avec g++ 3.4.1 (Linux i586), j'obtiens des messages du type:

p13-3.cpp:105: error: no matching function for call to
`Liste<int>::Ajouter(int)'
p13-3.cpp:41: note: candidates are: int Liste<T>::Ajouter(T&) [with T = int]



Ta fonction demande un int&. Une référence ne peut être liée qu'à une
"vraie" variable. Si tu veux pouvoir utiliser une constante (ou un
temporaire), il te faut utiliser soit un "T const &" soit un "T".

--
Loïc

Avatar
Anthony Fleury
Julien SCORDIA wrote:

Bonjour à tous,


Bonjour,

Avec g++ 3.4.1 (Linux i586), j'obtiens des messages du type:

p13-3.cpp:105: error: no matching function for call to
`Liste<int>::Ajouter(int)'
p13-3.cpp:41: note: candidates are: int Liste<T>::Ajouter(T&) [with T > int]
Où est le problème, je manque encore de recul.


Le problème est que la fonction Ajouter est déclarée ainsi :
template <class T> int Liste<T>::Ajouter(T& valeur)
Donc, la fonction ajouter attend une référence non constante sur un T (ici T
est le type int). Une référence non constante est une lvalue, c'est à dire
une valeur que l'on peut écrire à gauche d'une expression. Si tu as une
variable, genre
int a;
`a' peut être écrit à gauche, genre a = 2;
Par contre, toi tu ne lui envoies pas une lvalue, mais une constante :

ListeEntier.Ajouter(1);
ListeEntier.Ajouter(2);
ListeEntier.Ajouter(8);

Des constantes de ce genre sont des rvalues (valeurs qui peuvent être
écrites à droite d'une expression). En effet, tu ne pourras jamais écrire,
avec le a du dessus : 2 = a; ca n'a aucun sens.

Conclusion, avec un compilateur conforme, le seul moyen de faire fonctionner
ce code est d'écrire :

int a = 1, b = 2, c = 8, d = 3;
ListeEntier.Ajouter(a);
ListeEntier.Ajouter(b);
ListeEntier.Ajouter(c);
ListeEntier.Ajouter(d);

Ou bien de changer la définition de Ajouter (ce qui est largement préférable
comme solution) pour qu'il accepte des constantes :
template <class T> int Liste<T>::Ajouter(T valeur)
ou bien
template <class T> int Liste<T>::Ajouter(const T& valeur)

Anthony
--
Alan Turing thought about criteria to settle the question of whether
machines can think, a question of which we now know that it is about as
relevant as the question of whether submarines can swim.
-- Dijkstra

Avatar
Julien SCORDIA
Anthony Fleury wrote:

Ou bien de changer la définition de Ajouter (ce qui est largement
préférable comme solution) pour qu'il accepte des constantes :
template <class T> int Liste<T>::Ajouter(T valeur)


Merci beaucoup pour vos réponses à vous deux.
Je vais prendre cette solution.
Dommage de trouver des erreurs comme cela dans un bouquin édité par Micro
Application. Mais d'un autre côté, ce bouquin est assez synthétique, je
connais maintenant toutes les notions apportées par le C++ par rapport au
C.

Merci encore, Julien.
--
"Allez, Monsieur, allez, et la foi vous viendra." (D'Alembert).

Avatar
Fabien LE LEZ
On Sun, 20 Feb 2005 14:46:20 +0100, Julien SCORDIA
:

Dommage de trouver des erreurs comme cela dans un bouquin édité par Micro
Application.


Ben... C'est normal qu'il y ait des erreurs, c'est Micro Application.


--
;-)

Avatar
Julien SCORDIA
Fabien LE LEZ wrote:

Dommage de trouver des erreurs comme cela dans un bouquin édité par Micro
Application.


Ben... C'est normal qu'il y ait des erreurs, c'est Micro Application.


En réalité, j'avais appris le C en commençant par un livre Micro
Application, puis ensuite par le K&R.
Du coup, j'ai "cru" être en possession d'un bouquin Micro Application pour
mon apprentissage du C++, en fait il n'en était rien, c'est un livre de la
collection "Le Tout en Poche" de chez CampusPress (édité par Pearson
Education, comme le bouquin de Stroustrup). Du coup, c'est Micro
Application qui a reçu les coups à la place de l'autre...

Désolé...
--
"Allez, Monsieur, allez, et la foi vous viendra." (D'Alembert).