Происходит то, что bcd * 2
генерирует временный BCD
, который не может связываться с BCD &
. Попробуйте заменить оператор <<
одним из следующих:
friend ostream &operator<<(ostream &os, const BCD &bcd);
или
friend ostream &operator<<(ostream &os, BCD bcd);
или даже
friend ostream &operator<<(ostream &os, const BCD bcd);
Первый из них работает, поскольку привязка временной переменной к константной ссылке допускается явным образом, в отличие от привязки к неконстантной ссылке. Другие работают, делая копию временной переменной.
Edit:
Как отмечено в комментариях - в большинстве случаев предпочитайте const & version, поскольку изменение объекта в операторе потоковой передачи будет удивительным для любого, кто использует ваш класс. Чтобы это скомпилировать, может потребоваться добавить объявления const
в функцию-член вашего класса, где это уместно.