我在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;
}
预期行为:输出true
或1
编译错误(使用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;
^
这个编译错误意味着什么,以及如何修复它?
答案 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的全部目的,而不必在任何地方都使用循环。