• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wywołanie przeciążenia operatora<< (C++)

Object Storage Arubacloud
0 głosów
330 wizyt
pytanie zadane 9 lipca 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam napisałem program, w którym występują przeciązenia:

Obie występują klasie, ich deklaracja jest poprawna, różnia się wywołaniami

friend std::ostream & operator<<(std::ostream & out, const Wektor & word_out);
friend std::ostream & operator<<(std::ostream & out, double & multi);

Oto wywołania:

operator<<(std::cout, class_object);
 std::cout.operator<<(d_value);

Problem polega na tym, że wywołanie pierwszej funkcji jest całkowicie poprawne, natomiast drugie wyświetla wartość z wyrażenia, jednak nie wyświetla tekstu, ani przeniesienia do nowej linii.

std::ostream & operator<<(std::ostream & out, double & multi)
        {
                Wektor o;
                out << "\nMnożenie: " << o.operator*(multi) << std::endl << std::endl;
                return out;
        }

W jaki sposób mogę sprawić aby działał poprawnie?

2 odpowiedzi

0 głosów
odpowiedź 9 lipca 2018 przez adrian17 Ekspert (344,860 p.)
friend std::ostream & operator<<(std::ostream & out, double & multi);
std::cout.operator<<(d_value);

std::ostream już ma przeładowany operator<< - nie możesz go przeładować drugi raz.  W tym miejscu program po prostu wywołuje ten z biblioteki standardowej.

Gdybyś użył formy operatorowej, dostałbyś sensowny komunikat:

<source>:14:15: error: ambiguous overload for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'double')

     std::cout << x;

     ~~~~~~~~~~^~~~

Swoją drogą, czemu tak wywołujesz operatory, a nie... jak operatory?

komentarz 9 lipca 2018 przez Sic Dyskutant (8,510 p.)
To jeżeli nie mogę zrobić tego drugi raz to czy jest jakaś możliwość aby rozwiązać ten problem. Próbowałem też dodać trzeci argument do pierwszej funkcji jednak wystąpiło ograniczenie do dwóch.
komentarz 9 lipca 2018 przez adrian17 Ekspert (344,860 p.)

Próbowałem też dodać trzeci argument do pierwszej funkcji jednak wystąpiło ograniczenie do dwóch.

Bo to operator. Z definicji ma tylko lewą i prawą stronę.

Jeśli chcesz żeby

double x;
cout << x;

robiło coś innego niż domyślnie, musisz albo:

- zmienić lewą stronę na jakiś własny obiekt

- zmienić prawą stronę na jakiś własny obiekt.

komentarz 9 lipca 2018 przez Sic Dyskutant (8,510 p.)
Nie pomyślałem o tym w ten sposób.

Działa tak samo jak std::cout.operator<<(..) wyświetla  tylko wartość. Nie pokazuje napisu "Mnożenie" ani nie zauważa "\n"
0 głosów
odpowiedź 9 lipca 2018 przez criss Mędrzec (172,590 p.)
Przecież wywolujesz std::ostream::operator<< a nie swój globalny operator. Dlaczego nie napiszesz operator<<(std::cout, d_value); ?
komentarz 9 lipca 2018 przez Sic Dyskutant (8,510 p.)

Bo  gdy tak zrobiłem pokazał mi się błąd

call of overloaded ‘operator<<(std::ostream&, double&)’ is ambiguous

 

komentarz 9 lipca 2018 przez VirtualMember Pasjonat (15,790 p.)

Oznacza to, że jest dwuznaczny. Powinieneś móc go wywołać w ten sposób:

obj.T::operator<<(args)

 

komentarz 9 lipca 2018 przez Sic Dyskutant (8,510 p.)
‘class WEKTOR::Wektor’ has no member named ‘operator<<’

spróbowałem tego na wiele sposobów.

Podobne pytania

0 głosów
1 odpowiedź 246 wizyt
pytanie zadane 15 maja 2020 w C i C++ przez kacper1445 Gaduła (4,880 p.)
0 głosów
1 odpowiedź 1,164 wizyt
pytanie zadane 26 listopada 2016 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
1 odpowiedź 157 wizyt

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...