No matching function for call to `calcul_position::methode_LMS (IHM *&)'

berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006 - 23 mars 2006 à 17:09
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006 - 24 mars 2006 à 12:09
Bonjour,

Je suis novice en programation C++ (objet)
Et je ne comprend cette erreur, que veut dire "no matching function for call to" ?
Pour résumer mon exercice, j'ai 2 classes distinct A et B
Je dérive deux classes fille A1 et B1.
Il faudrait que je puisse récupérer dans un objet B1, une structure (struct) initialiser dans un objet A1.

Merci d'avance parce que ca fait plusieur jour que je suis dessus et je galère.

12 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
23 mars 2006 à 17:25
Cela veut dire qu'un appel à la fonction "methode_LMS" est foireux: mauvais passage de paramètres. Postes ton code et on va t'aider

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006
23 mars 2006 à 18:15
Merci bcp,

est il possible de l'envoyer dans un répertoir car ca serrai un peu long de tout copier ici.
Car il y a en tout 5 fichier.hpp, 5 fichier.cpp, main().cpp et le makefile.
De plus j'ai fait un exemple simple (avec 2 classes et sans héritage) trouver des solutions plus facilement, mais le probleme et que dans mon exemple simple ca marche.
Donc voila si je peut t'envoyer le tout ce serrai plus simple.

Encore merci d'avance.
A demain
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
23 mars 2006 à 20:58
Poste le bout de code qui fait l'appel de la fonction et celui qui contient la définition de la fonction. Pas besoin de tout ton projet...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006
24 mars 2006 à 09:05
ok alors voici

Déclaration des classes

class moindre_carre : public calcul_position
{
protected:
struct POS_LLA pos_calcule;

public:
moindre_carre();
~moindre_carre();
void methode_LMS(IHM *notre_IHM);
POS_LLA get_pos_calcule(){return pos_calcule;}
};

class IHM
{
protected:
struct config cfg;
struct POS_LLA pos_estime;

public:
IHM();
~IHM();
void afficher_resultat(struct POS_LLA);
void choix_iono();
void choix_recepteur();
void choix_systeme();
void choix_tropo();
void code_phase();
void mode_acquisition();
void mono_ou_bifrequence();
void selectionner_position_estime();
void methode_calcul();

config get_config(){return cfg;}
POS_LLA get_POS_LLA(){return pos_estime;}
};

Décraration des méthodes

void moindre_carre::methode_LMS(IHM *notre_IHM)
{ pos_calcule=(*notre_IHM).get_POS_LLA();}

void IHM::afficher_resultat(*notre_calcul_position.get_pos_calcule())
{ struct POS_LLA pos_final;
pos_final = notre_calcul_position.get_pos_calcule();
cout << "latitude = "<< pos_final.latitude << endl ;
cout << "longitide = "<< pos_final.longitude << endl ;
cout << "altitude = "<< pos_final.altitude << endl ;
cout << " Vous avez afficher le resultat \n " << endl ;
}

Le programe principal:

int main(int argc, char* argv[])
{
IHM notre_IHM;
//notre_IHM = new IHM;
acquisition *notre_acquisition;
correction notre_correction;
sat_position notre_sat_position;
calcul_position *notre_calcul_position;

notre_IHM.choix_recepteur(); /*construction objet acquisition correspondant */
notre_IHM.choix_systeme(); /*construction objet correction correspondant */
notre_IHM.selectionner_position_estime(); /*inintialise position estimée */
notre_IHM.methode_calcul();/*construction objet calcul_position correspondant*/
notre_IHM.mode_acquisition();
notre_IHM.mono_ou_bifrequence();
notre_IHM.code_phase();
notre_IHM.choix_tropo();
notre_IHM.choix_iono();

if (notre_IHM.get_config().recepteur==1)
{
cout << " Vous avez choisi un Récepteur Novatel \n " << endl ;
notre_acquisition = new recepteur_novatel() ;
}
else
{
cout << " Vous avez choisi un Récepteur XXX \n " << endl ;
notre_acquisition = new recepteur_XXX() ;
};

notre_calcul_position = new moindre_carre();

notre_calcul_position->methode_LMS(¬re_IHM); ligne 82

notre_IHM.afficher_resultat(); ligne 84

return 0;
}

Voici les erreurs qui me donne (surtout ligne 82 et 84)
g++ -c -Wall -I./point_hpp/ -o ./objects/main.o ./point_cpp/main.cpp
./point_cpp/main.cpp: In function `int main (int, char **)':
./point_cpp/main.cpp:82: no matching function for call to
`calcul_position::methode_LMS (IHM *)'
./point_cpp/main.cpp:84: no matching function for call to
`IHM::afficher_resultat ()'
point_hpp/IHM.hpp:46: candidates are: void IHM::afficher_resultat
(POS_LLA)
make: *** [objects/main.o] Error 1
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006
24 mars 2006 à 09:17
Et si c pas abusé, à quoi sert cette ligne car elle semble souvent utile pour résoudre des buggs. Et donc je pourrais en avoir besoin par la suite.

"using namespace std;"

Encore merci pour tout.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
24 mars 2006 à 09:38
Alors, pour le "using namespace std;", c'est assez simple. Le C++ est "découpé" en plusieurs namespaces (ou espace de noms) qui forment ce qu'on pourrait appeler un module. "cout", par exemple, fait partie de ce namespace. Dans un programme, si tu veux utiliser "cout" sans déclarer le namespace, tu est obligé d'utiliser la syntaxe suivante: "std::cout". En définitive, mettre le "using namespace std;" en début de ton programme allège ton code par la suite...

Pour la ligne 84, tu as oublié de donner un paramètre à la fonction afficher_resultat qui attend un POS_LLA.

Pour la ligne 82, voici ce que je te propose:
IHM * notre_IHM = new IHM();
...
notre_calcul_position->methode_LMS(notre_IHM);
...
delete notre_IHM;
return 0;

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006
24 mars 2006 à 11:08
Bon alors g tjrs le meme problemes

Seulement, pour la ligne 84 je devait faire la meme chose que sur la ligne 82.
Du coup g eu un probleme avec les includes car dans la classe calcul_position il ne connait pas la classe IHM et vise et versa.
G donc regroupé dans un meme fichier toute les déclaration des classes, mais il reste un probleme.
Merci d'avance pour ton temps.


g++ -c -Wall -I./point_hpp/ -o ./objects/main.o ./point_cpp/main.cpp
In file included from ./point_cpp/main.cpp:34:
point_hpp/class.hpp:62: `IHM' was not declared in this scope
point_hpp/class.hpp:62: `notre_IHM' was not declared in this scope
point_hpp/class.hpp:62: invalid data member initiailization
point_hpp/class.hpp:62: use `=' to initialize static data members
point_hpp/class.hpp:62: variable or field `methode_LMS' declared void
./point_cpp/main.cpp: In function `int main (int, char **)':
./point_cpp/main.cpp:82: no matching function for call to
`calcul_position::methode_LMS (IHM *&)'
make: *** [objects/main.o] Error 1


Voici a nouveau mon code

Déclaration des classes (.hpp)

class calcul_position
{
protected:
double cos_directeur[4][];
double delta_psr[];
double erreur[4];
double varience[4][];

void calcul_M_cos();
void calcul_M_err();
void calcul_M_var();

public:
calcul_position();
~calcul_position();
void verifier_seuil();
};

class moindre_carre : public calcul_position
{
protected:
struct POS_LLA pos_calcule;

public:
moindre_carre();
~moindre_carre();
void methode_LMS(IHM *notre_IHM); LIGNE 62 (class.hpp)
POS_LLA get_pos_calcule(){return pos_calcule;}
};

class kalman : public calcul_position
{
public:
kalman();
~kalman();
void methode_kalman();
};

/*---------------------------------------------------------------------------*/
/* Declaration de la classes IHM */
/* permet de configurer le programme */
/*---------------------------------------------------------------------------*/

class IHM
{
protected:
struct config cfg;
struct POS_LLA pos_estime;

public:
IHM();
~IHM();
void afficher_resultat(calcul_position *notre_calcul_position);
void choix_iono();
void choix_recepteur();
void choix_systeme();
void choix_tropo();
void code_phase();
void mode_acquisition();
void mono_ou_bifrequence();
void selectionner_position_estime();
void methode_calcul();

config get_config(){return cfg;}
POS_LLA get_POS_LLA(){return pos_estime;}
};

Déclaration des méthodes impliqué

void moindre_carre::methode_LMS(IHM *notre_IHM)
{
pos_calcule=(*notre_IHM).get_POS_LLA();
}

void IHM::afficher_resultat(calcul_position *notre_calcul_position)
{
struct POS_LLA pos_final;
pos_final = notre_calcul_position.get_pos_calcule();
cout << "latitude = "<< pos_final.latitude << endl ;
cout << "longitide = "<< pos_final.longitude << endl ;
cout << "altitude = "<< pos_final.altitude << endl ;
cout << " Vous avez afficher le resultat \n " << endl ;
}

Programme principal

#include <stdio.h>
#include <string.h>
#include <math.h>
#include

/*---------------------------------------------------------------------------*/
/* Inter-applications includes */
/*---------------------------------------------------------------------------*/

#include "structures.hpp"
#include "const.hpp"
#include "class.hpp" LIGNE 34 (main.cpp)
//#include "acquisition.hpp"
//#include "sat_position.hpp"
//#include "correction.hpp"
//#include "IHM.hpp"

/*---------------------------------------------------------------------------*/
/*2 programme principal du calcul du point GPS (+EGNOS) */
/*---------------------------------------------------------------------------*/

int main(int argc, char* argv[])
{
IHM* notre_IHM = new IHM();
//notre_IHM = new IHM;
acquisition *notre_acquisition;
correction notre_correction;
sat_position notre_sat_position;
calcul_position *notre_calcul_position;

notre_IHM->choix_recepteur(); /*construction objet acquisition correspondant */
notre_IHM->choix_systeme(); /*construction objet correction correspondant */
notre_IHM->selectionner_position_estime(); /*inintialise position estimée */
notre_IHM->methode_calcul();/*construction objet calcul_position correspondant*/
notre_IHM->mode_acquisition();
notre_IHM->mono_ou_bifrequence();
notre_IHM->code_phase();
notre_IHM->choix_tropo();
notre_IHM->choix_iono();

if (notre_IHM->get_config().recepteur==1)
{
cout << " Vous avez choisi un Récepteur Novatel \n " << endl ;
notre_acquisition = new recepteur_novatel() ;
}
else
{
cout << " Vous avez choisi un Récepteur XXX \n " << endl ;
notre_acquisition = new recepteur_XXX() ;
};

notre_calcul_position = new moindre_carre();

notre_calcul_position->methode_LMS(notre_IHM); LIGNE 82 (main.cpp)

notre_IHM->afficher_resultat(notre_calcul_position);

delete notre_IHM;
return 0;
}
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
24 mars 2006 à 11:18
Tu n'es pas obliger de mettre toutes tes délcarations de classe dans un même fichier .h, il faut juste que tu préviennes le compilateur que tu utilises une classe définie dans un autre fichier. Voici un exemple:

__________________
Fichier classA1.h

class A1
{
...
}
__________________
Fichier classA2.h

class A2
{
...
}
___________________
Fichier classB.h

#include "classA1.h" // inclut la définition de la classe classA1 que tu utilises

class classA2; // préviens que tu utilises un pointeur sur un objet de type classA2

class B
{
...
classA1 objetA1
classA2 * pObjetA2;
...
}
____________________

En espérant que cela soit assez clair...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
24 mars 2006 à 11:22
Pour ton nouveau pb (IHM was not declarated in this scope), si tu gardes ta structure actuelle (toutes tes classes dans un fichier), il faut que tu définisses ta class IHM avant toute utilisation: tu la mets donc en début de fichiers et c'est régler

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006
24 mars 2006 à 11:28
Ok j'avais à peut prés compris ca.
Mais dans mon cas, ca ce mordais la queu et il me disait que je définissais plusieurs fois les classes. enfin ce probleme n'est pas trop grave.
mais g toujours le probleme ligne 82 alors que je ne l'ai plus ligne 84. Et la je comprend absolument pas.

Je te remercie d'etre aussi clair, car tu as bien du comprendre que j'était pas trés doué.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
24 mars 2006 à 11:49
Bon, voyons ton pb "no matching call". C'est "vicieux" :)
En fait, dans ta classe calcul_position, tu n'as pas de méthode "afficher_resultat". Donc, ta ligne 82 est invalide... même si tu as créé un objet de type "moindre_carre". Ce qu'il faut faire: dire que tu veux utiliser la méthode de la classe moindre_carre, comme ceci

((moindre_carre *)notre_calcul_position)->methode_LMS(notre_IHM);

NB: Dans cette méthode, tu peux juste faire un pos_calcule=notre_IHM->get_POS_LLA();

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
berenger_R Messages postés 21 Date d'inscription vendredi 17 février 2006 Statut Membre Dernière intervention 3 avril 2006
24 mars 2006 à 12:09
Oui en fait il faut que l'objet notre_calul_position (qui doit etre un objet de la classe moindre_carre, car l'utilisateur choisira comme pour le recepteur_novatel ou recepteur_XXX d'utiliser moindre_carre ou kalman) puisse récupérer pos_estime qui est initialisé dans l'objet IHM afin de faire tout une serie de calcul. Puis l'objet IHM doit récupérer pos_calcule ainsi calculé afin de le sauvegarder dans un fichier.
Tu peux voir que j'en suis qu'au début, j'ai pas encore implémenté mes méthode. Je m'entraine pour l'instant.

Merci et bonne appetit.
0
Rejoignez-nous