由于cout << object ++,没有运算符“ <<”与这些操作数匹配

时间:2019-11-23 20:41:41

标签: c++

主要问题是,单独输入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

1 个答案:

答案 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引用即可。

希望这会有所帮助!