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

Problem z zadaniem (StephenPrata)

Object Storage Arubacloud
0 głosów
186 wizyt
pytanie zadane 23 marca 2019 w C i C++ przez Hailon Początkujący (310 p.)

Przy próbie wywołania metody sum(), za pomocą more.sum() otrzymuje taki błąd od kompilatora: error: cannot bind 'std::basic_ostream<char>' lvalue to 'std::basic_ostream<char>&&'|.

Nie za bardzo rozumiem o co chodzi :/

Nagłowek: 

#ifndef WINEC_H_INCLUDED
#define WINEC_H_INCLUDED
#include <iostream>
#include <valarray>
#include <string>
#include <cstring>

using namespace std;
template <class T1, class T2>
class Pair
{
    private:
        T1 Year;
        T2 Bottles;
    public:
        T1 & first();
        T2 & second();
        T1 first() const {return Year;}
        T1 second() const {return Bottles;}
        Pair(const T1 & aval, const T2 & bval) : Year(aval), Bottles(aval) {}
        Pair() {}
};
template<class T1, class T2>
T1 & Pair<T1, T2>::first()
{
    return Year;
}
template<class T1, class T2>
T2 & Pair<T1,T2>::second()
{
    return Bottles;
}
typedef valarray<int> ArrayInt;
typedef Pair<ArrayInt, ArrayInt> PairArray;
class Wine
{
    private:
        string label;
        int years;
        PairArray ilosc;

    public:
        Wine() : ilosc() {}
        Wine(const string & l, int y, const int yr[], const int bot[]);
        Wine(const string & l, int y) : label(l), years(y), ilosc(ArrayInt(y),ArrayInt(y)) {}
        void GetBottles();
        void Show() const;
        const string & Label() const;
        PairArray sum();
};

Definicje:

#include <iostream>
#include <valarray>
#include <string>
#include <cstring>
#include "winec.h"
using namespace std;
Wine::Wine(const string & l, int y, const int yr[], const int bot[]) : label(l), years(y), ilosc(ArrayInt(y),ArrayInt(y))
{
    for(int i = 0; i < years; i++)
    {
        ilosc.first()[i] = yr[i];
        ilosc.second()[i] = yr[i];
    }
}
void Wine::GetBottles()
{
    cout << "Podaj dane o winie " << label << " dla " << years << " rocznikow: " << endl;
    for(int i = 0; i < years; i++)
    {
        cout << "Podaj rocznik: ";
        cin >> ilosc.first()[i];
        cout << "Podaj liczbe butelelek: ";
        cin >> ilosc.second()[i];
    }
}
void Wine::Show() const
{
    cout << "Wino: " << label << endl;
    cout << "\tRocznik\t Butelki\n";
    for(int i = 0; i < years; i++)
    {
        cout << "\t" << ilosc.first()[i] << "\t" << ilosc.second()[i] << endl;
    }
}
const string & Wine::Label() const
{
    return label;
}
PairArray Wine::sum()
{
    PairArray sum;
    for(int i = 0; i < years; i++)
    {
        sum.second() += ilosc.second()[i];
    }
    return sum;
}

Plik testowy:

#include <iostream>
#include "winec.h"
using namespace std;

int main()
{
    cout << "Podaj nazwe wina: ";
    char lab[50];
    cin.getline (lab, 50);
    cout << "Podaj liczbe rocznikow: ";
    int yrs;
    cin >> yrs;
    Wine holding (lab, yrs) ; // Zapisuje nazwe, liczbe roczników i przekazuje
    // informacje o tej liczbie do tablicy
    holding.GetBottles () ; // Pobiera dane o roczniku i liczbie butelek
    holding.Show () ; // Wyswietla zawartosc obiektu
    const int YRS = 3;
    int y[YRS] = { 1993, 1995, 1998 };
    int b[YRS] = { 48, 60, 72 } ;
    // Tworzy nowy obiekt, inicjalizuje za pomoca danych w tablicach y oraz b
    Wine more("Gushing Grape Red", YRS, y, b ) ;
    more.Show();
    cout << "Laczna liczba butelek wina " << more.Label() << ": " << more.sum() << endl;
    cout << "Koniec\n";
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 24 marca 2019 przez criss Mędrzec (172,590 p.)

Nie mam pojęcia dlaczego dostajesz akurat taki błąd. Tutaj gcc poprawnie pokazuje co jest nie tak: http://coliru.stacked-crooked.com/a/6f0d373cee795bd4

error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'PairArray' {aka 'Pair<std::valarray<int>, std::valarray<int> >'})

Nie wiadomo co to znaczy cout << more.sum() bo nie masz zdefiniowanego operator<<(std::ostream&, const PairArray&) 

komentarz 24 marca 2019 przez Hailon Początkujący (310 p.)

Spróbowałem czegoś takiego ale dalej bez skutku :/

friend ostream & operator<<(ostream & stream, const PairArray & w);

ostream & operator<<(ostream & stream, const PairArray & w)
{
    stream << w.second();
    return stream;
}

Jakies sugestie?

komentarz 24 marca 2019 przez criss Mędrzec (172,590 p.)
Dla ArrayInt też nie masz zdefiniowanego tego operatora...
komentarz 24 marca 2019 przez Hailon Początkujący (310 p.)

Na gcc dostaje jakies smieci: 

Podaj nazwe wina: Podaj liczbe rocznikow: Podaj dane o winie  dla 25971 rocznikow: 
Podaj rocznik: Podaj liczbe butelelek: Podaj rocznik: Podaj liczbe butelelek: Podaj rocznik: Podaj liczbe butelelek:.....

Nwm tylko czy ten operator dla ArrayInt powinien wygladac tak samo jak dla PairArray :/

komentarz 24 marca 2019 przez Hailon Początkujący (310 p.)
std::ostream & operator<<(std::ostream & stream, const PairArray & w)
{
    stream << w;
    return stream;
}
std::ostream & operator<<(std::ostream & stream, const ArrayInt & w)
{
    stream << w;
    return stream;
}

Poszedlem w takie cos ale dalej bez skutków :/

komentarz 24 marca 2019 przez criss Mędrzec (172,590 p.)
Definiujesz operator nim samym. To nie ma żadnego sensu. To tak jakbyś napisał, że zrobienie herbaty polega na zrobieniu herbaty.

Podobne pytania

0 głosów
4 odpowiedzi 1,585 wizyt
pytanie zadane 17 lutego 2017 w Offtop przez Abachaczi Nowicjusz (240 p.)
+3 głosów
9 odpowiedzi 836 wizyt
pytanie zadane 6 czerwca 2015 w HTML i CSS przez Termi1878 Nowicjusz (190 p.)
0 głosów
1 odpowiedź 394 wizyt
pytanie zadane 1 marca 2019 w C i C++ przez Hailon Początkujący (310 p.)

92,551 zapytań

141,399 odpowiedzi

319,531 komentarzy

61,938 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!

...