Перегрузка операторов ввода/вывода

Надо перегрузить операторы ввода/вывода в поток. Пробую так:

class Parallelepiped
{
public:
    // ширина
    float width;

    // высота
    float height;

    // длина
    float length;

    float volume() const
    {
        return width * height * length;
    }

    istream& operator>>(istream& in)
    {
        in >> width;
        in >> height;
        in >> length;
        return in;
    }

    ostream& operator<<(ostream& out) const
    {
        return out << width << height << length;
    }
};

И не получается...

Ошибка C2679 бинарный ">>": не найден оператор, принимающий правый операнд типа "Parallelepiped" (или приемлемое преобразование отсутствует)

Ошибка C2679 бинарный "<<": не найден оператор, принимающий правый операнд типа "Parallelepiped" (или приемлемое преобразование отсутствует)

Что не так? Видел примеры когда оператор выносится из класса, либо как дружественная функция, но в задании сказано сделать методом.


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

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

Просто вы все сделали для того, чтобы работал такой код:

Parallelepiped p;

p >> cin;
p << cout;

Проверьте, убедитесь...

Чтобы работало так, как вы хотите - надо объявить операторы вне класса:

istream& operator>>(istream& in, Parallelepiped& p)
{
    in >> p.width;
    in >> p.height;
    in >> p.length;
    return in;
}

ostream& operator<<(ostream& out, const Parallelepiped& p)
{
    return out << p.width << p.height << p.length;
}

Оператор - член класса требует, чтобы первым в выражении был объект класса.

→ Ссылка