为什么不会cout <<使用重载*运算符?

Ski*_*ick 5 c++ operator-overloading

我正在创建我的第一堂课,主要由Overland的C++ Without Fear引导.我已经制作了重载的朋友ostream operator <<,它工作得很好.我也重载了*运算符,这很好用.当我尝试直接输出*运算符的结果时,什么不起作用:

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)'
Run Code Online (Sandbox Code Playgroud)

有关信息,这是我的原型:

BCD operator*(int z);
friend ostream &operator<<(ostream &os, BCD &bcd);
Run Code Online (Sandbox Code Playgroud)

据我所知,operator*返回一个BCD,因此operator <<应该能够打印它.请帮忙!

Ecl*_*pse 12

正在发生的bcd * 2是生成一个临时的BCD,不能绑定到BCD &.尝试<<使用以下方法之一替换运算符:

friend ostream &operator<<(ostream &os, const BCD &bcd);
Run Code Online (Sandbox Code Playgroud)

要么

friend ostream &operator<<(ostream &os, BCD bcd);
Run Code Online (Sandbox Code Playgroud)

甚至

friend ostream &operator<<(ostream &os, const BCD bcd);
Run Code Online (Sandbox Code Playgroud)

第一个工作,因为绑定临时变量到常量引用是明确允许的,不像绑定到非const引用.其他的工作是制作临时变量的副本.

编辑:正如评论中所述 - 在大多数情况下更喜欢const和版本,因为修改流媒体操作符中的对象对于使用您的类的任何人都会感到惊讶.要编译它可能需要const在适当的时候向类成员函数添加声明.