Feilanrop for overbelastet er tvetydig

Feilanrop for overbelastet er tvetydig
I denne artikkelen vil vi diskutere en feil som oppstår på C ++ -språk som er overbelastet call med er tvetydig. Denne feilen påvirker ikke hvordan koden kjøres fordi den oppstår på kompileringstidspunktet. Vi må vite hva overbelastning er. I overbelastning erklærer vi funksjoner med de samme navnene, men forskjellige datatyper. Systemet skiller mellom funksjonene på grunn av datatypene deres. Tvetydig refererer til å ha flere betydninger eller likheter. På andre måter kan vi si at tvetydig betyr uklart. Så, feilen forklarer seg selv.

Feilen oppstår når en funksjon som overbelaster kompilatoren tolker funksjonene som en enkelt funksjon og ikke kan gjøre en forskjell mellom de to overbelastede funksjonene basert på datatypene deres. Så vi kan si at denne feilen oppstår på grunn av kompilatorens manglende evne til å gjøre et utvalg mellom to med rette overbelastede metoder. Hele denne prosessen sies å være tvetydig fordi den er uklart. Koder og programmer som inneholder slike uklarheter kan ikke sammenstille og til slutt generere feil.

Syntaks

Dette er ikke en innebygd funksjon eller bibliotek vi diskuterer, snarere er det en feil, og en feil har ikke en spesifikk syntaks. Dette er meldingen som kompilatoren kommer tilbake når vi får feilen vår.

Feil: Ring over overbelastet 'setval (int)' er tvetydig

Merk: Ordet 'setVal (int)' er ikke konstant.

Eksempel # 01:

For å ha en bedre forståelse av feilen vår vil vi nå utføre et eksempel for å få feilen, og etter det vil vi løse feilen. For å gjøre det, har vi erklært en klasse med navnet klasse1. I klasse1 har vi erklært private usignerte røyedata [byte]. I klassens offentlige seksjon har vi erklært to funksjoner med samme navn, "SameFunc". Men vi har gitt "usignert int" til en som en parameter og "const char" til den andre som en parameter, slik at vi kan overbelaste metodene ved å ha de samme navnene og forskjellige datatyper som parametere. I den første "samefunc" har vi skrevet ut "int" med verdien som ble gitt til den. I den andre funksjonen har vi skrevet ut "røye" med verdien som er gitt til vår andre funksjon. Med bruk av et objekt i klassen vår, kalte vi metoden hovedmetoden. Nå vil vi utføre koden vår for å se hva som skjer.

#inkludere
#Define byte 8
ved hjelp av navneområdet STD;
Klasse klasse 1

privat:
usignerte røyedata [byte];
offentlig:
void SameFunc (int);
void SameFunc (const char *);
;
void Class1 :: SameFunc (int t)

cout<<"int"<
void Class1 :: SameFunc (const char *s)

cout<<"char"<
int main ()
Klasse1 P;
p.SameFunc (0);
retur 0;

Etter utførelsen av koden vår har systemet gitt oss en feilmelding. Hvis vi tar en titt på feilmeldingen, kan vi se at meldingen er nesten den samme som vi diskuterte tidligere. Den eneste forskjellen er funksjonsnavnet. Vi fortalte deg tidligere at funksjonsnavnet vil fortsette å endre seg avhengig av hva du har erklært som navnet på funksjonen din. Uansett har systemet gitt oss feilen at "overbelastningsanrop er tvetydig". Et spørsmål oppstår at vi har gitt “0” til vår funksjon og “0” er et heltall, hvorfor har systemet gitt oss denne feilen? La oss grave ut grunnen og prøve å løse feilen.

For å løse feilen vil vi ikke skrive ut hele koden vår igjen, vi har ganske enkelt fjernet nøkkelordet "usignert" før "int" i vår første funksjon. Etter det utførte vi koden vår, og koden er utført med hell.

Feilen var forårsaket fordi verdien “0” har to betydninger på C ++ -språket. For det første er det et heltall. For det andre, når det gjelder karakterer, er det en nullpeker konstant. Kompilatoren klarte ikke å avgjøre i vårt tilfelle om inngangsparameteren vår var et heltall eller en nullpeker konstant. Vi brukte to datatyper for metodene våre int og char. Så kompilatoren ble forvirret. Etter å ha fjernet nøkkelordet, tok kompilatoren parameteren som et heltall og utførte funksjonen med en heltalldatatype.

Eksempel # 02:

For å få deg til å forstå bedre feilen blir diskutert. Vi har utført et annet eksempel her. I dette eksemplet har vi erklært to metoder med de samme navnene “AddVals”. Men forskjellen mellom de to funksjonene er at den ene tar heltall som inngangsparametere og den andre tar flyter som inngangsparametere. Begge metodene har samme formål, de tar inngangsparametere og oppsummerer verdiene deres opp. I hovedmetoden skrev vi ut resultatet etter at de har utført operasjoner på inngangsparametrene våre. Vi vil utføre koden vår for å sjekke utdataene.

#inkludere
ved hjelp av navneområdet STD;
int addVals (int x, int y)

returner x+y;

int addVals (float x, float y)
returner x+y;

int main ()
cout<retur 0;

Nok en gang har systemet ikke gitt oss noen utdata. I stedet har den kastet en feilmelding. Feilmeldingen er igjen den samme som den forrige. Men funksjonsnavnet er annerledes. I dette tilfellet passerte vi verdier “1.2 ”og“ 3.4 ”til vår funksjon som er tydelig at disse verdiene er flyter. Et spørsmål kan oppstå om hvorfor systemet ikke har utført jobben sin og gitt oss feilen. For å få grunnen, vil vi prøve å løse feilen, og ved å gjøre det vil vi også få svaret vårt.

Nå, for å løse feilen har vi lagt “1.2f ”og“ 3.4f ”med våre parametere. Vi vil utføre koden igjen for å se om denne tilnærmingen hjelper til med å løse feilen vår eller ikke. La oss igjen utføre koden vår for å se hva som skjer.

Systemet har ikke gitt oss noen feil denne gangen og har utført koden vår med hell. Så problemet i koden vår var at vi ikke satte “F” i våre parametere. Vi antok at kompilatoren ville lese dem som flyteverdier i stedet for heltall. Men vi tok feil fordi kompilatoren identifiserer alle flottørene som dobbelt i utgangspunktet med mindre vi setter "F" som et suffiks. Når vi har lagt vårt suffiks, er koden blitt samlet.

Konklusjon

I denne guiden diskuterte vi en annen feil som er "Call of Overbelastning (funksjon) er tvetydig". Vi diskuterte hvorfor feilen oppstår. Vi diskuterte også begrepet overbelastning av funksjoner for å forstå vår feil på en bedre måte. Eksempler ble utført for å hjelpe deg med å få et bedre grep om å løse feilen.