【问题标题】:Invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>' and 'void')二进制表达式的无效操作数('std::ostream'(又名 'basic_ostream<char>' 和 'void')
【发布时间】:2021-02-20 18:24:45
【问题描述】:

我正在尝试编写一个函数来求解一个二次方程,我在第 26 行得到了这个错误:

Invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>' and 'void')

但我不太明白为什么编译器会发誓以及它想从我这里得到什么。我连接了库&lt;ostream&gt;,但它不起作用。请帮我弄清楚!谢谢。

这是代码:

#include <iostream>
#include <math.h>
#include <ostream>

using namespace std;

void Kva(float a,float b, float c)
{
    float Diskr, x1, x2;

    Diskr = (b*b) - (4*a*c);

    if (Diskr >= 0)
    {x1 = ((-b) - sqrt(Diskr))/(2*a);
    x2 = ((-b) + sqrt(Diskr))/(2*a);
    cout << "x1 =" << " " << x1 << ";" << " " << "x2 =" << " " << x2 << endl;}
    else {cout << "Diskriminant < 0" << endl;}

    //return x1;
}

int main()
{
    float a, b, c;
    cin >> a >> b >> c;
    cout << Kva(a, b, c) << endl;
    return 0;
}

【问题讨论】:

  • 您正试图打印调用Kva(a, b, c) 的结果,但该调用实际上并没有返回任何结果;该函数被声明为返回void。这就是错误消息告诉您的内容。
  • Kva() 返回voidoperator&lt;&lt;(std::ostream&amp;, void) 没有重载,也无法定义。 (void 不是函数/运算符参数的有效类型。)您不能在 cout &lt;&lt; Kva(a, b, c) &lt;&lt; endl; 中使用 Kva()。这就是错误的原因。
  • @IgorTandetnik 谢谢!我仔细想想。当用户输入他的值 a、b 和 c 时,我想输出 x1 和 x2。但是,如果我不是在编写 void 函数,而是例如 float,那么我不知道如何返回两个“x”,而不仅仅是其中一个
  • 目前,您在Kva() 内部进行了输出。因此,只需调用Kva(a, b, c); 即可完成输出。但是,有多种方法可以从函数返回多个值。其中之一是将各个值组合在一起,例如带有structstd::tuple。 (如果您想直接将返回值与std::cout 一起使用,则必须为operator&lt;&lt; 提供另一个重载。但您只需将返回值分配给局部变量,然后照常进行输出。)

标签: c++ function


【解决方案1】:

看看你的函数原型:

void Kva(float a, float b, float c)

你告诉编译器什么都不传递。您可能想要求函数返回 float 类型。取消注释 return 语句。

对于Kva() 中的x1,请记住对其进行初始化,以保证向函数返回一些值(至少为零)以避免任何不需要的结果。

【讨论】:

  • 谢谢!我试图引入一个返回float的函数,但我不明白在这种情况下如何获得x1和x2,而不仅仅是x1
  • @Max 您一次只能返回一个原始类型值。但是,您可以设置一些条件来告诉函数何时返回 x1 以及何时返回 x2
  • @Max 你可以,例如,返回一个 std::pair 或者你可以在参数列表中通过引用返回。
猜你喜欢
  • 1970-01-01
  • 2017-03-12
  • 2021-09-09
  • 2016-05-08
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
相关资源
最近更新 更多