Erreur C2668 : ambiguous call to overloaded function - pb de recursivite ????
cs_ecully
Messages postés1Date d'inscriptionmercredi 4 février 2004StatutMembreDernière intervention 4 février 2004
-
4 févr. 2004 à 23:10
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
5 févr. 2004 à 01:05
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 !!!
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
}
}
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 5 févr. 2004 à 01:05
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&);