Как исправить оператор ввода в поток (<<) строкового представления объекта?

Имею некоторую структуру Sample, в которой реализованы базовые операции над ней. Мне потребовался оператор << для ввода ее строкового представления в std::cout. Проблема в том, что я не могу вывести результат, к примеру, сложения двух объектов Sample, не записав его в другой объект. Я не хочу этого делать так как желаю упростить запись.

Иллюстрационный пример

#include <iostream>

struct Sample
{
    int value;

    Sample(int Value) :
        value(Value)
    {}

    friend std::ostream& operator<<(std::ostream& os, Sample& it)
    {
        os << "Sample(" << it.value << ')';
        return os;
    }

    friend Sample operator+(const Sample& S1, const Sample& S2)
    {
        return Sample(S1.value + S2.value);
    }
};

int main()
{
    Sample A(3);
    Sample B(4);

    // Можно так:
    std::cout << A << std::endl;
    std::cout << B << std::endl;
    // Но не так:
    //std::cout << A + B << std::endl;
    //std::cout << (A + B) << std::endl;
    //std::cout << ... << std::endl;
    // Желаю упростить запись:
    Sample C = A + B;
    std::cout << C << std::endl;
    // Проблема: ?

    return 0;
}

Вывод (не важен):

Sample(3)
Sample(4)
Sample(7)

Visual Studio о .. << A + B << .. говорит: C++ отсутствует оператор, соответствующий этим операндам типы операндов: std::ostream << Sample, а о .. << A << .. говорит C++ std::ostream &operator<<(std::ostream &os, Sample &it). Наталкивает на то, что я должен как-то изменить параметры friend std::ostream& operator<<(std::ostream& os, Sample& it), но что конкретно мне нужно сделать - я не могу понять. Убрать std::ostream& os? И в что тогда записывать?

Сам вопрос

Как мне исправить friend std::ostream& operator<<(std::ostream& os, Sample& it), чтобы я мог записывать как std::cout << A << std::endl; , так и std::cout << A + B << std::endl;?


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

Автор решения: Harry
friend std::ostream& operator<<(std::ostream& os, const Sample& it)
→ Ссылка