Почему cout << не работает с перегруженным * оператором? - PullRequest
5 голосов
/ 16 января 2009

Я создаю свой первый класс, в основном руководствуясь C ++ Overland без страха. Я сделал перегруженный друг ostream operator <<, который отлично работает. Я также перегружен оператор *, и это прекрасно работает. Что не работает, так это когда я пытаюсь вывести результат оператора * напрямую: </p>

BCD bcd(10);  //bcd is initialised to 10
BCD bcd2(15); //bcd2 is initialised to 15
cout << bcd;  //prints 10
bcd2 = bcd2 * 2; //multiplies bcd2 by 2
cout << bcd2; //prints 30

cout << bcd * 2 //SHOULD print 20, but compiler says
//main.cpp:49: error: no match for 'operator<<' in 'std::cout << BCD::operator*(int)(2)'

Для информации, вот мои прототипы:

BCD operator*(int z);
friend ostream &operator<<(ostream &os, BCD &bcd);

Насколько я могу судить, оператор * возвращает BCD, поэтому оператор << должен иметь возможность его распечатать. Помогите пожалуйста! </p>

1 Ответ

12 голосов
/ 17 января 2009

Происходит то, что 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 в функцию-член вашего класса, где это уместно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...