如何解决此错误:二进制表达式的操作数无效('std::vector<double>' 和 'double')?

Posted

技术标签:

【中文标题】如何解决此错误:二进制表达式的操作数无效(\'std::vector<double>\' 和 \'double\')?【英文标题】:How can I fix this error: Invalid operands to binary expression ('std::vector<double>' and 'double')?如何解决此错误:二进制表达式的操作数无效('std::vector<double>' 和 'double')? 【发布时间】:2019-06-17 12:48:38 【问题描述】:

我想获得一些陀螺仪读数的平均值,它涉及将 std::vector&lt;double&gt; 类型与 double 类型相除,但我收到以下错误报告

二进制表达式的无效操作数('std::vector' 和 'double')

我该如何解决这个问题?


    double n_readings;
    std::vector<double> gyro_reading;
    for(int i = 0; i < n_readings; i++) 

        gyro_reading.push_back(gyro_z());
        msleep(1);

    

    double average = gyro_reading/n_readings;

【问题讨论】:

您不能将向量除以数字。要获得平均值,请将向量的元素相加,然后除以向量的大小。检查这个问题,看看如何做到这一点:***.com/questions/3221812/… double average = std::accumulate(std::begin(gyro_reading),std::end(gyro_reading), 0.0) / n_readings。将需要 algorithm 标头。 std::valarray 直接支持成员操作,对于std::vector,您必须使用循环或算法 为什么投反对票?这是一个完全有效的问题。 @Mansoor您应该发表您的评论作为答案,最好附上关于为什么 OPs 尝试不起作用的简短解释。 我是minimal reproducible examples 的绝对粉丝,但是来吧。 OPs 错误信息很清楚。即使这就是原因,我也看到 4 个反对票,但只有 1 个投票结束,因为它缺少 minimal reproducible example。 OP 应该如何以这种方式改进他们的问题。 【参考方案1】:

您对gyro_reading/n_readings 的调用需要在类型std::vector&lt;T&gt;T 之间定义/ 运算符。标准向量没有这样的运算符。即使是这样,结果也可能是按元素除而不是求和然后除。

以下内容:

#include <iterator>
#include <numeric>
//...
double average = std::accumulate(std::begin(gyro_reading),std::end(gyro_reading), 0.0) / n_readings;

将累加所有元素gyro_reading,默认使用operator+进行缩减,然后除以n_readings。此外,您可以使用gyro_reading.size() 而不是n_readings,因为这将始终保持一致。

【讨论】:

sum 部分与std::accumulate(gyro_reading.begin(), gyro_reading.end(), 0.0) 有何不同?会导致同样的结果吗? 如果gyro_readingstd::vector,则没有区别。免费函数更通用,可以与 C 数组一起使用,请参阅 post。

以上是关于如何解决此错误:二进制表达式的操作数无效('std::vector<double>' 和 'double')?的主要内容,如果未能解决你的问题,请参考以下文章

错误:二进制表达式的操作数无效('float' 和 'float')

矢量排序和擦除不起作用

XCode 错误“二进制表达式的无效操作数”

C ++新手:从实现学习单独的接口并得到错误:VSCode中的二进制表达式的操作数无效

错误消息:“float”和“int”类型的无效操作数到二进制“operator%”

C++ std::thread 无效使用 void 表达式