Ответ 1
Использование перегрузки оператора-друга должно сделать трюк для вас и является обычным способом определения двоичных операторов, просто добавьте:
friend sample operator+(const sample& a, const sample& b); //in class
sample operator+(const sample& a, const sample& b) { //outside the class
return sample(a.x + b.x);
}
Если вы хотите, чтобы он оставался участником (который имеет недостатки в некоторых редких сценариях и без него), вы должны сделать оператор функцией const
:
sample operator+(sample s) const; //in class
sample sample::operator+(const sample& b) const { //outside the class
return sample(this->x + b.x);
}
Любой из них позволит цепочку операторов. Причина, по которой произошел предыдущий s = s + s1 + s2
, заключается в том, что s + s1
выполнит и вернет временный объект sample
. Затем он попытается добавить s2
к этому образцу. Тем не менее, временные файлы могут быть const
ссылками [1] и поэтому могут использовать только функции-члены const
. Поскольку ваша функция-член operator+
не является функцией const
, вы не можете использовать эту функцию в const
временную. Обратите внимание, что для этого const
мне пришлось переписать его, так как ваша версия изменяет объект в левой части +
.
[1] с исключениями здесь не особо важны, а именно rvalues