我正在创建我的第一堂课,主要由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)'
有关信息,这是我的原型:
BCD operator*(int z); friend ostream &operator<<(ostream &os, BCD &bcd);
据我所知,operator*返回一个BCD,因此operator <<应该能够打印它.请帮忙!
正在发生的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和版本,因为修改流媒体操作符中的对象对于使用您的类的任何人都会感到惊讶.要编译它可能需要const
在适当的时候向类成员函数添加声明.