Klaida „Cout yra dviprasmiška“ C++

Klaida Cout Yra Dviprasmiska C



Šis straipsnis yra susirūpinęs dėl dviprasmiškų klaidų C++ programavimo kalboje. Dviprasmiška situacija susidaro, kai kompiliatorius negali nustatyti metodų ar operatorių, kurie turi būti naudojami atliekant skirtingas užduotis. Kartais naudojame tą pačią parametro funkciją su ta pačia vardų erdve, o tada abiem atvejais apibrėžiamas cout. Kai vykdome programą, kompiliatorius generuoja cout dviprasmišką klaidą, nes kompiliatorius nesupranta, kokią reikšmę šis kodas rodo. Cout dviprasmiškumas atsiranda, kai programoje egzistuoja konfliktas tarp apibrėžtų vardų erdvių arba kelių funkcijų deklaracijų.

1 pavyzdys:

Tai yra dviprasmiškos klaidos, dažniausiai pasitaikančios programuojant C++, pavyzdys. Čia pamatysime, kaip kompiliatorius generuoja dviprasmiškas klaidas cout, kai naudojame kelias vardų sritis. Šio pavyzdžio kodo fragmentas paminėtas toliau:







#include

vardų erdvė nešiojamas kompiuteris {

tuštuma ekranas ( ) {

std :: cout << 'tai yra nešiojamojo kompiuterio vardų erdvė' << std :: endl ;

}

}

vardų erdvė mobilusis {

tuštuma ekranas ( ) {


std :: cout << 'tai yra mobilioji vardų erdvė' << std :: endl ;

}

}

tarpt pagrindinis ( ) {

naudojant vardų erdvė nešiojamas kompiuteris ;
naudojant vardų erdvė mobilusis ;

ekranas ( ) ;

grąžinti 0 ;


}

Čia mes paėmėme programą su dviem vardų erdvėmis, kurios yra apibrėžtos pagal mūsų poreikius. Norime ekrane rodyti eilutes. Šio kodo išvestis pridedama taip:





Vykdant kodą, sugeneruojama klaida dėl dviprasmiškos situacijos. Klaida atsiranda todėl, kad kompiliatoriui nuskaitant kodą, kompiliatorius negauna aiškios įvesties iš vartotojo pusės. Kode naudojome kelias vardų erdvės deklaracijas. Visame kode mes naudojome „rodymo“ metodą tik norėdami parodyti išvestį ekrane. Kompiliatorius neįsivaizduoja, kuris rodymo metodas yra susijęs su kuria vardų erdve. Turime padaryti kodą paprastą ir aiškų, kad kompiliatorius lengvai suprastų veiksmus, nepadarydamas kodo dviprasmiško.





Šios klaidos sprendimas yra iškviesti metodą su susijusia vardų erdve pagrindinėje funkcijoje, kad kompiliatorius geriau suprastų. Aiškiai nurodome, kurį vardų erdvės metodą norime iškviesti pagrindinėje vykdymo dalyje.

#include

vardų erdvė nešiojamas kompiuteris {

tuštuma ekranas ( ) {


std :: cout << 'tai yra nešiojamojo kompiuterio vardų erdvė' << std :: endl ;

}

}

vardų erdvė mobilusis {

tuštuma ekranas ( ) {

std :: cout << 'tai yra mobilioji vardų erdvė' << std :: endl ;

}

}

tarpt pagrindinis ( ) {

naudojant vardų erdvė nešiojamas kompiuteris ;
naudojant vardų erdvė mobilusis ;
nešiojamas kompiuteris :: ekranas ( ) ;
grąžinti 0 ;


}

Čia mes galime tiesiog susieti Display() metodą su pagrindinės funkcijos vardų erdve „nešiojamasis kompiuteris“, kaip parodyta ankstesnėje ekrano kopijoje. Dabar paleiskite programą. Išvestis rodoma konsolės lange.



2 pavyzdys:

Šis scenarijus yra susijęs su dviprasmiška C++ klaida. Kompiliatorius rodo klaidą, kai nesupranta vykdymo eigos. Šio pavyzdžio kodo fragmentas pridedamas taip:

#include

vardų erdvė Kalbėjimas {

tuštuma spausdinti ( tarpt i ) {

std :: cout << 'C kalbos vardų sritis:' << i << std :: endl ;

}

}

vardų erdvė java {

tuštuma spausdinti ( tarpt j ) {

std :: cout << „Java kalbos vardų sritis:“ << j << std :: endl ;

}

}

naudojant vardų erdvė Kalbėjimas ;

naudojant vardų erdvė java ;

tarpt pagrindinis ( ) {

spausdinti ( 5 ) ;
grąžinti 0 ;


}

Šiame kode apibrėžiame visas reikalingas bibliotekos antraštes. Sukuriame dvi vardų sritis skirtingiems tikslams. Vardų erdvėje „Clanguage“ apibrėžiame „spausdinimo“ metodą, kuris iš vartotojo paima sveikojo skaičiaus reikšmę. Funkcijoje „spausdinti“ norime parodyti reikšmę, kurią vartotojas perdavė konsolės ekrane. Mes rodome reikiamą išvestį naudodami „cout“ srautą mūsų kode. Po to apibrėžiame kitą vardų erdvę, kurios pavadinimas yra „Java“.

Šioje „Java“ vardų erdvėje mes vėl naudojame „print“ metodą, kad parodytume reikšmę, kurią vartotojas perduoda naudodamas „cout“. Mes iškviečiame abi vardų sritis, kad galėtume naudoti pagrindinę funkciją, kad gautume norimą išvestį konsolės lange C++. „Pagrindinėje“ funkcijoje vadiname „print()“ perkrautą funkciją, kad konsolės ekrane būtų rodoma perduota reikšmė.

Pagrindiniame meniu spustelėkite parinktį „vykdyti“ ir pasirinkite parinktį „sudaryti ir vykdyti“. Klaida dėl dviprasmiškumo atsiranda vykdant šį kodą. Klaidos ekrano kopija pridedama taip:

Ši klaida rodo, kad kompiliatorius yra sutrikęs dėl iškviečiamos perkrautos funkcijos print(). Ši klaida yra 19 eilutėje „spausdinti (5)“. Kompiliatorius yra sumišęs dėl vardų erdvės, kuriai priklauso ši perkrauta funkcija. Pradedantiesiems dažniausiai įstrigo tokios klaidos.

Išspręskime šią klaidą, kuri iš tikrųjų nėra sudėtinga. Dviprasmiškos klaidos lengvai išsprendžiamos. Turime nurodyti vardų erdvę kartu su perkrauta funkcija „pagrindinėje“ funkcijoje, kad kompiliatorius būtų matomas ir suprantamas. Kaip ir šioje programoje, mes pridedame šį „java::print(5)“ į esamą kodą, kaip nurodyta toliau:

#include

vardų erdvė Kalbėjimas {

tuštuma spausdinti ( tarpt i ) {

std :: cout << 'C kalbos vardų sritis:' << i << std :: endl ;

}

}

vardų erdvė java {

tuštuma spausdinti ( tarpt j ) {

std :: cout << „Java kalbos vardų sritis:“ << j << std :: endl ;

}

}

naudojant vardų erdvė Kalbėjimas ;

naudojant vardų erdvė java ;

tarpt pagrindinis ( ) {

java :: spausdinti ( 5 ) ;
grąžinti 0 ;


}

Dabar programa vykdoma puikiai, be jokios dviprasmiškos klaidos ir rodo išvestį konsolės ekrane. Šios programos išvestis pridedama taip:

3 pavyzdys:

Tai yra paskutinis ir paskutinis pavyzdys, susijęs su klaida, sugeneruota dėl dviprasmiškos problemos. Kompiliatorius negali gauti teisingo rezultato. Šio pavyzdžio kodo fragmentas pridedamas toliau, kad vartotojas geriau suprastų:

Čia apibrėžiame reikalingas bibliotekas. Po to apibrėžiame vardų erdvę, kurioje yra klasė, kurioje norime rodyti eilutę konsolės lange. Šią apibrėžtą vardų erdvę vadiname „pagrindinėje“ funkcijoje su kintamuoju „c“. Po to mes iškviečiame print() metodą naudodami vardų erdvės objektą. Po metodo iškvietimo konsolės ekrane vėl rodome eilutę. Išvestis turi būti abi eilutės ir rodoma konsolės ekrane. Kai vykdome šį kodą, įvyksta klaida, kaip parodyta toliau:

#include

naudojant vardų erdvė std ;

vardų erdvė myNamespace {

klasė cout {
viešas :
tuštuma spausdinti ( ) {


cout << 'Custom cout' << std :: endl ;

}

} ;

}

tarpt pagrindinis ( ) {

myNamespace :: cout c ;
c. spausdinti ( ) ;


cout << 'Labas pasauli!' << std :: endl ;

grąžinti 0 ;

}

Kompiliatorius nepasirinko „cout“ teiginio, kuris rodo duomenis konsolės ekrane. Kompiliatorius negali suprasti vardų erdvės, priklausančios cout sakiniui, ir sukuria klaidą. Šios klaidos sprendimas yra pridėti vardų erdvės objektą su „cout“ sakiniu, kad kompiliatorius būtų skaitomas ir suprantamas. Prie cout teiginio pridėkite „std::“ ir paleiskite kodą. Konsolės ekrane rodoma ši išvestis:

Išvada

Čia galime pasakyti, kad išvesties rodymas konsolės ekrane taip pat generuoja klaidą, kuri nėra sintaksės ar logikos klaida. Dažniausiai vartotojas rašo gerai suvokdamas kodą, tačiau tai nesuprantama kompiliatoriui. Kompiliatorius yra dviprasmiškas dėl įvesties. Taigi, paaiškinkite kiekvieną kodo veiksmą naudodami tinkamą vardų tarpą ir sintaksę, kad išvengtumėte klaidų C++ programavimo kalboje. Šios problemos sprendimo veiksmai yra aiškių kvalifikatorių naudojimas, vardų erdvės susidūrimų prevencija ir užtikrinimas, kad numatytos funkcijos arba objektai identifikuotų šios problemos sprendimo veiksmus.