Erreur C2668 : ambiguous call to overloaded function - pb de recursivite ????

Signaler
Messages postés
1
Date d'inscription
mercredi 4 février 2004
Statut
Membre
Dernière intervention
4 février 2004
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Bonjour,
je cherche mais ne trouve pas la cause de 2 erreurs de ce programme :
error C2668: 'insert' : ambiguous call to overloaded function
cette erreur survient lors des 2 appels de la fonction insert par récursivité.
Merci de votre aide !!!

#include
#include <list>
#include <string>
#include <fstream>
#include

using namespace std;

struct motligne;
typedef motligne *arbin; // def de l'arbre
struct motligne
{
string mot; // structure arborescente pr ordre alphabétique ABOH
list lignes;
arbin gauche, droit; // stockage en liste
};

void insert(string,int,arbin);
void affichage(arbin);
arbin recherche(string,arbin);

void main()
{
char c;
string nomfichier; //lecture du texte sur disque
string mt;
int numligne = 1; // mise en mémoire ds type struct mot
arbin a=0, arb; // SD arborescente?
// en +: écrire un programme qui crée le fichier dique pr pouvoir tester par la suite

cout<<"entrez nom de fichier"<<endl;
cin>> nomfichier;
ifstream fi(nomfichier.c_str(),ios::in); //ouverture fichier disque
if(fi)
{
c=fi.get(); //lecture de caractère sur flot sans filtrage
while (fi)
{
if(strchr(" \n\r,.;:'",c)) //détection fin de mot
{
if(mt!=" ")
{
arb=recherche(mt,a); // pr chaque mot, on teste s'il est déjà ds l'arbre
if (arb==0) // si non, on crée un nveau noeud à l'arbre

{
insert(mt,numligne,a);
}
else arb->lignes.push_back(numligne); //si il y est on rajoute le numéro de ligne à la liste lignes du mot
mt=" ";
}
if(c=='\n') //saut de ligne
numligne++;
}
else mt=mt+c;
}

fi.close();
affichage(a);
}

else cout<<"erreue à l'ouverture du fichier"<<endl;
}

arbin recherche(string mt, arbin a) // recherche d'un mot dans l'arbre
{
if (a==0)
return 0;
if (a->mot==mt)
return a;
if ( a->mot< mt) // puisqu'on choisit d'utiliser un arbre ABOH,
return recherche(mt, a->droit); //les sous-programmes de recherche et d'insertion ont une forme simple
else return recherche(mt, a->gauche); //ils utilisent les propriétés des arbres ABOH
}

void insert(string mt, int l, arbin &a) //procédure d'insertion d'un mot ds l'arbre
{
if(a==0)
{
a=new motligne; //création d'un nveau noeud
a->mot=mt;
(a->lignes).push_back(l);
a->gauche=0;
a->droit=0;
}

else
{
if(mt < a->mot)
insert(mt,l,a->gauche); // insertion du mot ds le SAG
else insert(mt,l,a->droit); //insertion du mot ds le SAD
}
}

void affichage(arbin a)
{
list::iterator it;
if(a!=0)
{
affichage(a->gauche);
cout<<setw(20)<mot<<" ";
for(it=(a->lignes).begin();it!=(a->lignes).end();it++)
cout<<*it<<" ";
cout<<endl;
affichage(a->droit);
}
}

1 réponse

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
tu déclare la fonction insérer comme cela :
void insert(string,int,arbin);

et lors de la défnition comme cela :
void insert(string mt, int l, arbin &a)

=> pour le compilateur, ce sont 2 fonctions différentes.

Donc dans le corps de la fonction insert, lorsque tu appelle récursivement insert, le compilateur ne sait pas laquelle appeler car les paramètres passés ne lui permette pas de trancher (le troisième argument peut être consider comme de type arbin ou référence sur arbin).

=> la déclaration au début du prog doit correspondre à la définition de la fonction :
void insert(string,int,arbin&);