【问题标题】:no match for 'operator+=' (operand types are 'std::basic_ostream<char>' and 'int')'operator+=' 不匹配(操作数类型为 'std::basic_ostream<char>' 和 'int')
【发布时间】:2016-12-01 08:09:08
【问题描述】:

给定以下代码;

#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 &lt;&lt; result_1 += number_1; 行给了我一个错误。

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

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

谁能解释一下错误是什么原因,是什么原因?

【问题讨论】:

  • cout &lt;&lt; result_1 返回cout 对象。该对象没有 += 整数重载。
  • 此外,将计算与输出混合通常不是一个好主意。如果您先计算所有值并稍后执行输出,则通常会导致代码更清晰,错误更少。 (你刚刚找到了其中之一 :-)

标签: c++ compiler-errors operators


【解决方案1】:
  1. 谁能解释一下错误是什么原因,是什么原因?

根据Operator Precedenceoperator&lt;&lt; 的优先级高于operator+=,所以你的代码相当于:

(cout << result_1) += number_1;

虽然cout &lt;&lt; result_1 将返回std::cout(即std::ostream&amp;),然后尝试在std::ostream 上调用operator+=,但它不存在。这就是错误消息试图告诉您的内容。

你可以改成:

cout << (result_1 += number_1) ;

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

result_1 += number_1;
cout << result_1;
  1. 另一方面,cout &lt;&lt; ++result_1; 运行时没有任何问题。

因为operator++ 的优先级高于operator&lt;&lt;。所以它等同于cout &lt;&lt; (++result_1); 并且可以。

【讨论】:

  • 其实你“不应该”这样做
【解决方案2】:

如果你看一下运算符优先级规则,你会发现语句等价于

(cout << result_1) += number_1 ;

operator&lt;&lt; 返回std::cout。而且不存在std::ostream::operator+=(int)

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

另一方面 cout

正如人们所期望的那样。研究运算符的优先级。

【讨论】:

    【解决方案3】:

    仔细阅读您的编译器错误。一切都在那里:)。

    错误的原因是运算符优先级。
    编译器首先执行cout &lt;&lt; result_1
    然后,它尝试执行如下内容:cout += number_1
    有什么意义吗?

    按照你的意图改变你的线路:

    cout << (result_1 += number_1);
    

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

    【讨论】:

      【解决方案4】:

      运算符优先级.

      该调用在语义上等同于 cout &lt;&lt; result_1; cout += result; 之类的东西 - 这是无效的。

      在代码中添加括号(允许+=&lt;&lt;之前计算)如下允许代码编译;

      cout << (result_1 += number_1);
      

      关于错误本身;编译器无法为提供的参数找到operator += 的实现——没有标准的实现。这是因为cout &lt;&lt; result_1operator += 之前被评估。从上面看,这是有道理的,但并不能立即表明可以在哪里应用潜在的修复。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-18
        • 2021-12-17
        • 1970-01-01
        • 2020-12-12
        相关资源
        最近更新 更多