我正在创建我的第一堂课,主要由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;应该能够打印出来。求救!
答案 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
声明。