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.
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
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
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".
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
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 :
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
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 :
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
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 :
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
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).
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).
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).
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.
-- ;-)
On Sun, 20 Feb 2005 14:46:20 +0100, Julien SCORDIA
<Nojulien_dot_scordia@free_._frspaM>:
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.
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.
-- ;-)
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).
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).
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).