[C++][resolu]error: no matching function for call to...

error: no matching function for call to... [C++][resolu] - C++ - Programmation

Marsh Posté le 10-11-2008 à 11:57:57    

Salut à tous, c'est encore moi..
 
Voila j'ai cette erreur dont j'arrive pas à identifier la source depuis hier:
 
Banque.cpp: In member function ‘std::string Banque::historiqueMensuel(Date*)’:
Banque.cpp:87: error: no matching function for call to ‘CompteEnBanque::releve_mensuel(Date*& ) const’
CompteEnBanque.h:49: note: candidates are: std::string CompteEnBanque::releve_mensuel(Date*) <near match>
make: *** [Banque.o] Error 1
 
 
Dans le banque.h

Citation :


[...]  
#include "CompteEnBanque.h"
public: std::string historiqueMensuel(Date * date);  
[...]  


 
Dans le Banque.cpp

Citation :


 
[...]  
    std::string Banque::historiqueMensuel(Date * date){
  std::list<CompteEnBanque>::const_iterator lit=listeComptes.begin();
  std::ostringstream s;
 
  while(lit!=listeComptes.end()){
   s<<" Total: "<<std::endl<<lit->releve_mensuel(date)<<std::endl;  //PROBLEME ICI      
   lit++;
  }
  return s.str();
 }
 
[...]  


 
Dans Le CompteEnBanque.h

Citation :


[...]  
#include"Date.h"
 
std::string releve_mensuel(Date * date);
[...]  


 
 
CompteEnBanque.cpp

Citation :


 
 std::string CompteEnBanque::releve_mensuel(Date * date){
   std::list<Operation>::const_iterator lit=historique.begin();
   std::ostringstream s;
   
   monthTrans=0;
   while(lit!=historique.end()){
    [...]
    monthTrans+=lit->getMontant();          
    lit++;
   }
   return s.str();
 }  


 
Je ne comprend pas pourquoi, alors que l'appel de fonction est bon, avec les bons types en arguments, le compilateur
fais comme si j'appelais une fonction const avec un argument de type Date*& alors que ce n'est qu'un Date*!
 
Merci encore à ceux qui sauront m'aider.

Message cité 2 fois
Message édité par durk le 10-11-2008 à 18:23:03
Reply

Marsh Posté le 10-11-2008 à 11:57:57   

Reply

Marsh Posté le 10-11-2008 à 12:02:13    

durk a écrit :

[...]
Dans le banque.h

Citation :

[...]  
#inclide "CompteEnBanque.h"
public: std::string historiqueMensuel(Date * date);  
[...]  

[...]


 [:cend]

Reply

Marsh Posté le 10-11-2008 à 12:06:53    

^^ merci, mais en fait cette faute vient du fait que j'ai retappé en partie mon code.
Sur l'orignale elle y est pas  :ange: (j'espere que je l'aurais vu sinon etant donné le nombre d'error auquel j'aurais eu droit  :sweat: ).
 
J'edit ca.
 
 
Pour mieu comprendre, quand je retire l'appel releve_mensuel(date) du code, je n'ai plus aucune erreur et le tout compile...


Message édité par durk le 10-11-2008 à 12:08:07
Reply

Marsh Posté le 10-11-2008 à 12:26:26    

Ta méthode travaille sur des objets const, elle doit donc être déclarée const

 
Code :
  1. std::string releve_mensuel(Date * date) const;


Message édité par Joel F le 10-11-2008 à 12:26:40
Reply

Marsh Posté le 10-11-2008 à 12:46:08    

T'en as vraiment besoin des ces * et de ces *& ?

Reply

Marsh Posté le 10-11-2008 à 12:49:47    

Merci aussi Taz
 
Bah en fait j'ai besoin d'une date pour pouvoir travailler dessus. Mais que je lui passe un pointeur ou bien une
date (passage par copie ce qui ne me change rien), le compilo fait comme si je lui passait une reference dans
une fonction const.  
 
Ce qui n'est pas le cas en pratique, je lui passe un pointeur sur une fonction declarée non constante...


Message édité par durk le 10-11-2008 à 12:50:07
Reply

Marsh Posté le 10-11-2008 à 13:40:35    

Personne ??  :(  
 
jvois vraiment pas d'ou ca peut venir... :cry:

Reply

Marsh Posté le 10-11-2008 à 13:44:07    

La classe "CompteEnBanque" ne contient pas de méthode "releve_mensuel".

Reply

Marsh Posté le 10-11-2008 à 13:50:59    

Sisi elle en contient bien une..
 
J'ai posté dans mon premier message le CompteEnBanque.h avec le prototype pour montrer
qu'elle etait bien dedans.. Sinon l'erreur aurait ete differente..
 
Un appercu de la methode est donnée dans ma reponse à Joel..

Reply

Marsh Posté le 10-11-2008 à 13:58:24    

Non, ce que tu as posté c'est le prototype d'une fonction dans un .h, nul part on y voit la définition d'une méthode 'releve_mensuel' pour une classe 'CompteEnBanque'.
Tu n'as pas mis la définition de la classe, et par conséquent on ne peut déduire du message d'erreur que le fait que la classe ne contient pas une telle méthode.

 

Mets donc la définition de ta classe, qu'on y jette un oeil, mais je reste pour le moment sur mon diagnostic.


Message édité par Elmoricq le 10-11-2008 à 13:58:55
Reply

Marsh Posté le 10-11-2008 à 13:58:24   

Reply

Marsh Posté le 10-11-2008 à 14:03:33    

C'est la définition de la classe que je souhaite examiner.

Reply

Marsh Posté le 10-11-2008 à 14:13:02    

heu... desolé mais jcomprends pas ce que tu veux exactement...:(  
 
les entetes?
 

Citation :


#ifndef BAN_H
#define BAN_H
 
#include"CompteEnBanque.h"
 
class Banque{
 
[...]


 

Citation :


#ifndef COMPTE_H
#define COMPTE_H
 
#include<iostream>
#include<sstream>
#include<list>
#include"Date.h"
 
class CompteEnBanque{
[...]
 


 
ou c'est autre chose?

Reply

Marsh Posté le 10-11-2008 à 14:14:52    

Code :
  1. class CompteEnBanque {
  2. //contenu
  3. };


 
Je voudrais voir "contenu".

Reply

Marsh Posté le 10-11-2008 à 14:16:36    

soit:   :jap:  
 

Code :
  1. #include"Date.h"
  2. class CompteEnBanque{
  3. protected:
  4.  [...]
  5. public:
  6.  [...]
  7.  std::string releve_mensuel(Date * date);
  8.  [...]
  9. };
  10.  
  11.    
  12. #endif


Message édité par durk le 11-11-2008 à 11:59:03
Reply

Marsh Posté le 10-11-2008 à 14:25:29    

C'est donc bien ça.
Tu as dans CompteEnBanque une méthode :
   std::string releve_mensuel(Date * date);

 

Or ce que recherche le compilateur, c'est :
   std::string releve_mensuel(Date * & date) const;

 

Méthode qui n'existe pas dans ta classe.

Message cité 1 fois
Message édité par Elmoricq le 10-11-2008 à 14:26:35
Reply

Marsh Posté le 10-11-2008 à 15:10:15    

:??:

Reply

Marsh Posté le 10-11-2008 à 15:44:12    

Pourquoi tu utilises un const_iterator et pas un iterator tout bête ?

Reply

Marsh Posté le 10-11-2008 à 15:55:54    

j'ai vu ca sur un tuto :ange: , j'ai pas cherché plus loin ^^.
 
jvais tester si ca change quelque chose sans.
Merci pour la remarque.

Reply

Marsh Posté le 10-11-2008 à 17:22:18    

un const iterator ca renvoit des iterator vers des objets const et donc ta methode doit etre cosnt.
 
La constitude des méthodes c'est pas à prendre à la légére :o

Reply

Marsh Posté le 10-11-2008 à 18:16:01    

Wé c'etait ca!!!!
 
Franchement, passer deux jours sur ca, jsuis defait!!
 
Merci à tous!
 :jap:

Reply

Marsh Posté le 10-11-2008 à 19:52:02    

durk a écrit :

j'ai vu ca sur un tuto :ange: , j'ai pas cherché plus loin ^^.


 
En ce cas je te suggère plutôt de te renseigner sur ce site : http://cplusplus.com
Il y a là un bref cours de C++, et toutes les méthodes de la STL décrites avec des snippets d'exemple. Personnellement, je n'ai pas trouvé de site plus synthétique et pratique à utiliser.

Reply

Marsh Posté le 16-01-2009 à 04:16:39    

Elmoricq a écrit :

C'est donc bien ça.  
Tu as dans CompteEnBanque une méthode :
   std::string releve_mensuel(Date * date);
 
Or ce que recherche le compilateur, c'est :
   std::string releve_mensuel(Date * & date) const;
 
Méthode qui n'existe pas dans ta classe.


 
comment ça ?
c'est ce qu'il nous a expliqué au début
l'erreur lui dit qu'il tente d'appeler :       std::string releve_mensuel(Date * & date) const;
qui n'existe pas
et lui propose d'essayer :       std::string releve_mensuel(Date * date);

durk a écrit :


Je ne comprend pas pourquoi, alors que l'appel de fonction est bon, avec les bons types en arguments, le compilateur
fais comme si j'appelais une fonction const avec un argument de type Date*& alors que ce n'est qu'un Date*!  


 
donc l'erreur ne venait pas de là puisqu'il appelle correctement la méthode...
 
_______________________________________________
 
J'ai un problème similaire !
 
une fonction d'affichage :

Code :
  1. void print(ostream &os) const
  2.     {
  3.         iterateur<ExprAr*> it(liste_fils);
  4.         ...
  5.     }


 
erreur :

Code :
  1. erreur: no matching function for call to «iterateur<ExprAr*>::iterateur(const liste<ExprAr*>& )»|
  2. note: candidats sont: iterateur<T>::iterateur(liste<T>& ) [with T = ExprAr*]|


 
c'est exactement ce que je fais
c'est le const qui fout sa merde, pourquoi ?

Reply

Marsh Posté le 16-01-2009 à 09:42:54    

bah oui.

Reply

Marsh Posté le 16-01-2009 à 10:08:22    

const ne fout pas sa merde, c'ets quoi qui ne type pas correctement tes objets et tes méthodes.
 
Ta méthode print est const, elle ne peut donc pas modifier l'instance appelante. Dans print, tout tes membres sont const. Or iterator<T> attend une objet non-const car il doit pouvoir modifier son contenu. liste_fils étant const, ca ne passe pas. Il faut utiliser const_iterator.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed