Ошибка при попытке перегрузки оператора <<

Помогите понять, в чем дело. Недавно дошел до классов и перегрузок и мне необходимо написать программу, выводящую на экран данные о книге: шифр ISBN, название, имя автора и дату регистрации книги. Я решил написать отдельные классы для хранения ISBN и даты, а так же класс, хранящий и остальные параметры, и объекты предыдущих классов.

Вот так выглядит заголовочный файл:

using std::string;
using std::istream;
using std::ostream;
namespace info_col
{
    class ISBN {
    // ......
    };

    class Book {
    public:
        string author() const { return athr; }
        string name() const { return book_n; }
        Date date() const { return d; }
        ISBN isbn() const { return ciph; }

        Book(ISBN isbn, string name, string author, Date date);
        Book(); // конструктор по умолчанию
     private:
        Date d; // объект класса Date
        ISBN ciph; // объект класса ISBN
        string athr;
        string book_n;
    };

    class Date {
    // ......
    };

    ostream& operator<< (ostream& os, const Book& b);
}

А вот файл .cpp:

#include "book_header.h"
namespace info_col
{
    // определения конструкторов ISBN
    // определения конструкторов Date
 
    // определяем конструктор класса Book
    Book::Book(ISBN isbn, string name, string author, Date date)
        : ciph(isbn), book_n(name), athr(author), d(date)
    {}
    
    ostream& operator<< (ostream& os, const Book& b)
    {
        os << "Шифр ISBN: " << b.isbn() << '\n'
            << "Название книги: " << b.name() << '\n'
            << "Автор: " << b.author() << '\n'
            << "Дата регистрации: " << b.date() << " (дд.мм.гггг)" << '\n'
            << "Наличие книги в библиотеке: " << '\n' // проверка наличия книги, необходимо добавить
            << "=================================="; 
        return os;
    }
}

Когда я перегружаю оператор <<, на этапе ... << b.isbn() << ... и ... << b.date() << ... появляется ошибка: отсутствует оператор "<<", соответствующий этим операндам. В чем проблема? По идее, я обращаюсь к функциям-членам класса Book, которые возвращают объекты классов ISBN и Date, а не напрямую к ним. Можно ли вообще так делать? Или же придется перегружать операторы для всех классов?


Ответы (1 шт):

Автор решения: Harry

У вас не написаны операторы для вывода нужных вам типов, а в стандарте их нет :)

Например:

<< "Дата регистрации: " << b.date()

Здесь должен выводиться

Date d; // объект класса Date

Но разве в стандартной библиотеке есть оператор для вывода вашего типа Date?

Допишите отсутствующие операторы, и все получится. Или выводите как-то иначе (к сожалению, у вас в вопросе не написано, что собой представляют эти типы, для которых нет операторов, так что подсказать подробнее нет возможноси).

→ Ссылка