Ошибка при попытке перегрузки оператора <<
Помогите понять, в чем дело. Недавно дошел до классов и перегрузок и мне необходимо написать программу, выводящую на экран данные о книге: шифр 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 шт):
У вас не написаны операторы для вывода нужных вам типов, а в стандарте их нет :)
Например:
<< "Дата регистрации: " << b.date()
Здесь должен выводиться
Date d; // объект класса Date
Но разве в стандартной библиотеке есть оператор для вывода вашего типа Date?
Допишите отсутствующие операторы, и все получится. Или выводите как-то иначе (к сожалению, у вас в вопросе не написано, что собой представляют эти типы, для которых нет операторов, так что подсказать подробнее нет возможноси).