Странная ошибка компиляции C ++ с valarrays

У меня странная ошибка компиляции с использованием 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;
^

Что означает эта ошибка компиляции и как ее исправить?

3

Решение

Проблема в том, что сравнивая значения с == не возвращает bool, это возвращает std::valarray<bool>, делая сравнение поэлементно.

Если вы хотите сравнить их на равенство, вы можете позвонить min() на результат, так как false < true:

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

Другие решения

Что мешало вам читать документацию? == не работает таким образом для valarrays. Он сравнивает каждый элемент по индексу и возвращает новое значение bools, содержащие каждый результат.

В самом деле, вся цель Valarrays позволяет быстро и легко выполнять операции с упорядоченным набором значений без необходимости прибегать к написанию циклов везде.

4

По вопросам рекламы [email protected]