У меня странная ошибка компиляции с использованием valarrays в C ++.
Это урезанная версия моего кода:
#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;
^
Что означает эта ошибка компиляции и как ее исправить?
Проблема в том, что сравнивая значения с ==
не возвращает bool
, это возвращает std::valarray<bool>
, делая сравнение поэлементно.
Если вы хотите сравнить их на равенство, вы можете позвонить min()
на результат, так как false < true
:
return (a*x==b).min();
Что мешало вам читать документацию? ==
не работает таким образом для valarrays. Он сравнивает каждый элемент по индексу и возвращает новое значение bool
s, содержащие каждый результат.
В самом деле, вся цель Valarrays позволяет быстро и легко выполнять операции с упорядоченным набором значений без необходимости прибегать к написанию циклов везде.