Тема: Error (active) no operator "<<" matches these operands

Хочу зробити масив об'єктів, але чомусь виникає посилка при їх виведені

класи
class book
{
private:
    char *_name;
    int _length;
protected:
    char *getNameBook() { return _name; }
    int getLengthBook() { return _length; }
    virtual char *getNameClass() = 0;
public:
    book() = delete;
    book(char *name, int length) : _name(name), _length(length) {}
};

class educational : public book
{
protected:
    char *getNameClass()
    {
        return "educational";
    }
public:
    educational(char *name, int length) : book(name, length) {}
    friend ostream &operator<<(ostream &os, educational &obj)
    {
        return os
            << obj.getNameClass()
            << ": "
            << obj.getNameBook()
            << "; book: "
            << obj.getLengthBook()
            << ";\n";
    }
};

class scientific : public book
{
protected:
    char *getNameClass()
    {
        return "educational";
    }
public:
    scientific(char *name, int length) : book(name, length) {}
    friend ostream &operator<<(ostream &os, scientific &obj)
    {
        return os
            << obj.getNameClass()
            << ": "
            << obj.getNameBook()
            << "; book: "
            << obj.getLengthBook()
            << ";\n";
    }
};

class legislative : public book
{
protected:
    char *getNameClass()
    {
        return "educational";
    }
public:
    legislative(char *name, int length) : book(name, length) {}
    friend ostream &operator<<(ostream &os, legislative &obj)
    {
        return os
            << obj.getNameClass()
            << ": "
            << obj.getNameBook()
            << "; book: "
            << obj.getLengthBook()
            << ";\n";
    }
};

Виникає така помилка:
"Error (active) no operator "<<" matches these operands"

    {
        educational *a = new educational("!educational!", 255);
        scientific *b = new scientific("!scientific!", 255);
        legislative *c = new legislative("!legislative!", 255);

        //array
        book *arr[] = { a, b, c };
                
                //Робить
        cout << *a;
        cout << *b;
        cout << *c;

        for (book *ele : arr)
        {
            cout << *ele;//ТУТ ПОМИЛКА!!!!!!!!!!!!!!!!!!
        }

        delete c;
        delete b;
        delete a;
    }

Чому ? Як виправити помилку ?

2

Re: Error (active) no operator "<<" matches these operands

Я не знаю сі, але можливо тому, що << тут як побітовий оператор і немає одного з операндів?

Цікаво чи вгадав.

Подякували: Betterthanyou1

3 Востаннє редагувалося Betterthanyou (13.03.2017 20:43:28)

Re: Error (active) no operator "<<" matches these operands

VTrim написав:

Я не знаю сі, але можливо тому, що << тут як побітовий оператор і немає одного з операндів?

Цікаво чи вгадав.

Прихований текст

це C++ а не сі, в сі немає ООП

Можливо й вгадали, але тоді чому як побітовий оператор ? Я перевантажив оператор "<<"
(У всіх класах)

friend ostream &operator<<(ostream &os, educational &obj)

Скорій всього я щось "накрутив" з абстрактним класом book, але не розумію що ?

4 Востаннє редагувалося Betterthanyou (13.03.2017 20:49:52)

Re: Error (active) no operator "<<" matches these operands

Розібрався

Я кругом перевантажив оператор "<<", а в класі book - ні,
я думав що в абстрактному класі не потрібно нічого перевантажувати.

class book
{
private:
    char *_name;
    int _length;
protected:
    char *getNameBook() { return _name; }
    int getLengthBook() { return _length; }
    virtual char *getNameClass() = 0;
public:
    book() = delete;
    book(char *name, int length) : _name(name), _length(length) {}
    friend ostream &operator<<(ostream &os, book &obj)
    {
        return os
            << obj.getNameClass()
            << ": "
            << obj.getNameBook()
            << "; book: "
            << obj.getLengthBook()
            << ";\n";
    }
};

Всетаки VTrim вгадав.

Подякували: LoganRoss, VTrim2

5 Востаннє редагувалося LoganRoss (13.03.2017 20:53:29)

Re: Error (active) no operator "<<" matches these operands

можна спробувати вивести інформацію іншим способом, наприклад printf(), якщо працюватиме, то швидше всього що оператор "<<" не перегружається. А якщо не працюватиме, то, мабуть, щось не так з класом, можливо приймаються не ті параметри, хоча все наче добре.
Запізнився з порадою :(

Подякували: Betterthanyou1