主要问题是,单独输入cout<<f1;
的效果与单独f1++;
的效果一样,但是当尝试一起输入cout<<f1++;
时,它表明该错误知道在使帖子递增时会显示该错误正在返回分数对象。
ostream& operator <<(ostream& output, fraction& fraction1)
{
output << "[" << fraction1.num << "/" << fraction1.denom << "]" << endl;
return output;
}
fraction fraction::operator ++(int)
{
fraction temp = *this;
++(this->num);
++(this->denom);
return temp;
}
int main()
{
fraction f1;
cout << f1;
f1++;
cout << f1++ << endl; // Results in compiler error
return 0;
}
编译器错误为:no operator "<<" matches these operands
答案 0 :(得分:1)
以此类推,请考虑以下设置:
void doSomething(int& x) {
x = 137;
}
int main() {
doSomething(42); // Oops!
}
此代码无法编译,因为指示的行中有错误。函数doSomething期望使用int&
,您可以将其视为“请给我一个实际的int变量或我可以更改的int对象。”但是42不是int变量-它是一个纯值,因此是错误。
现在,假设您将main更改为此:
int main() {
int var = 42;
doSomething(var++); // Oops!
表达式var++
的意思是“递增var,然后递归它曾经拥有的值。”这意味着我们仍在将纯值42传递给函数,因为该函数需要对象而不是对象值,它将无法编译。
但是,您可以通过将doSomething更改为const int&
来制作此版本的主要工作:
void doSomething(const int& x) {
// do something other than change x
}
由于C ++如何定义const引用,因此此代码可以正常工作。与常规引用(即“我希望能够更改此对象”)不同,const引用在您传递纯值时可以正常工作,因为const位的意思是“我保证不会在此处实际更改任何内容。”
现在,看看您的代码。基本上与上面显示的想法相同:您有一个名为operator<<
的函数,其第二个参数为fraction&
。这意味着您无法传递++运算符的结果。而且解决方法是相同的-只需更改第二个参数以使用const引用即可。
希望这会有所帮助!