Как исправить оператор ввода в поток (<<) строкового представления объекта?
Имею некоторую структуру 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;?