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

时间:2009-01-16 20:59:54

标签: c++ operator-overloading

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

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);

据我所知,operator *返回一个BCD,因此运算符&lt;&lt;应该能够打印出来。求救!

1 个答案:

答案 0 :(得分:12)

正在发生的事情是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);

第一个是有效的,因为将临时变量绑定到常量引用是明确允许的,这与绑定到非const引用不同。其他的工作是制作临时变量的副本。

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