使用valarrays发生奇怪的C ++编译错误

时间:2014-07-08 09:58:42

标签: c++ compiler-errors syntax-error std valarray

我在C ++中使用valarrays有一个奇怪的编译错误。

这是我的代码的简化版本:

#include <iostream>
#include <valarray>

using namespace std;

bool test(const int &x,const valarray<int> &a,const valarray<int> &b) {
    return a*x==b;
}

int main() {
    int a1[3]= {1,2,3};
    int b1[3]= {2,4,6};
    valarray<int> a(a1,3);
    valarray<int> b(b1,3);
    int x=2;
    cout<<test(x,a,b);
    return 0;
}

预期行为:输出true1

的某些变体

编译错误(使用g ++):

main.cpp: In function ‘bool test(const int&, const std::valarray<int>&, const std::valarray<int>&)’:
main.cpp:7:14: error: cannot convert ‘std::_Expr<std::_BinClos<std::__equal_to, std::_Expr, std::_ValArray, std::_BinClos<std::__multiplies, std::_ValArray, std::_Constant, int, int>, int>, bool>’ to ‘bool’ in return
  return a*x==b;
              ^

这个编译错误意味着什么,以及如何修复它?

2 个答案:

答案 0 :(得分:8)

问题是将valarrays与==进行比较并不会返回bool,而是返回std::valarray<bool>,按比例逐元素地进行比较。

如果您想比较它们的相等性,可以在结果上调用min(),因为false < true

return (a*x==b).min();

答案 1 :(得分:4)

什么阻止您阅读文档?对于valarray,==不能以这种方式工作。它按索引方式比较每个元素,并返回包含每个结果的bool个新的valarray。

确实, valarrays is to enable quick and easy operations on an ordered set of values的全部目的,而不必在任何地方都使用循环。