• 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++)

0 głosów
566 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 Mentor (354,880 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 Mentor (354,880 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,570 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ź 391 wizyt
pytanie zadane 15 maja 2020 w C i C++ przez kacper1445 Mądrala (5,070 p.)
0 głosów
1 odpowiedź 1,302 wizyt
pytanie zadane 26 listopada 2016 w C i C++ przez sofnir Gaduła (4,690 p.)
0 głosów
1 odpowiedź 283 wizyt

93,692 zapytań

142,611 odpowiedzi

323,220 komentarzy

63,220 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...