Ваша первая проблема заключается в том, что вы пытаетесь переслать объявление ostream
как класса. Предполагая, что вы хотите использовать std::ostream
, вы не можете этого сделать, это не разрешено законом.
Например, typedef
для специализации шаблона, а не сам класс.
Во-вторых, поскольку у вас нет #include <ostream>
, у вас нет определения для любой из стандартных <<
перегрузок для ostream
, поэтому при попытке <<
строкового литерала компилятор пытается преобразовать строковый литерал типа Rational
, так как это единственный тип с видимой перегрузкой <<
.
Проще говоря, вам нужно #include <ostream>
и квалифицировать ostream
с std::
там, где вы его используете.
Третий момент заключается в том, что ваша перегрузка operator<<
должна что-то вернуть. Вы должны либо добавить оператор return os;
, либо просто return
целое потоковое выражение.