不匹配'operator + ='(操作数类型是'std :: basic_ostream <char>'和'int')

时间:2016-07-27 10:49:59

标签: c++ compiler-errors operators

给出以下代码;

#include<iostream>
using namespace std;

int main(){
    int number_1 = 3;
    int result_1 = 10;
    result_1 += number_1;
    cout << ++result_1;
    cout << result_1 += number_1;
}

cout << result_1 += number_1;行给我一个错误。

  

'operator + ='不匹配(操作数类型为'std :: basic_ostream'和'int')

另一方面,cout << ++result_1;正在运行,没有任何问题。

任何人都可以解释错误是什么,原因是什么?

4 个答案:

答案 0 :(得分:5)

  
      
  1. 任何人都可以解释错误是什么,原因是什么?
  2.   

根据Operator Precedenceoperator<<的优先级高于operator+=,因此您的代码等同于:

(cout << result_1) += number_1;

虽然cout << result_1将返回std::cout(即std::ostream&),然后尝试在operator+=上调用std::ostream并且它不存在。这是错误信息试图告诉你的内容。

您可以将其更改为:

cout << (result_1 += number_1) ;

或从根本上避免这种令人困惑的代码。

result_1 += number_1;
cout << result_1;
  
      
  1. 另一方面,cout << ++result_1;正在运行,没有任何问题。
  2.   

Beasuse operator++的优先级高于operator<<。所以它等同于cout << (++result_1);并且没问题。

答案 1 :(得分:2)

如果您查看运算符优先级规则,您会发现该语句等同于

(cout << result_1) += number_1 ;

operator<<会返回std::cout。并且没有std::ostream::operator+=(int)

解决方案:使用括号表示预期的操作顺序。

  

另一方面,cout&lt;&lt; ++ result_1;没有任何问题

正如人们所料。研究运营商的优先级。

答案 2 :(得分:2)

运营商优先级

该调用在语义上等同于cout << result_1; cout += result; - 这是无效的。

在代码中添加括号(允许在+=之前计算的<<),如下所示允许代码编译;

cout << (result_1 += number_1);

关于错误本身;编译器无法为所提供的参数找到operator +=的实现 - 它不是标准的实现。这是因为cout << result_1operator +=之前进行了评估。从上面来看,这是有道理的,但并不能立即指出可以应用潜在修复的位置。

答案 3 :(得分:1)

仔细阅读commpiler错误。一切都在那里:)。

错误的原因是运算符优先。
编译器首先执行cout << result_1
然后,它尝试执行如下操作:cout += number_1
有任何意义吗?

要做你想要的改变你的行:

cout << (result_1 += number_1);

我强烈建议您阅读此内容: http://en.cppreference.com/w/cpp/language/operator_precedence