hinafu
hinafu

Reputation: 689

Why isn't this compiling? no match for 'operator&='

I'm getting a strange error when I try to compile this:

class CucumberMarket {
public:
  bool ans;
  int n,cont,K,b;
  bool check(const vector<int> &precios,long long price,int pos) {
    ++cont;
    if(cont == K and b < price) ans = false;
    if(!ans) return ans;
    for(int i = pos + 1; i < n; ++i) {
      if(cont < K) ans &= check(precios,price + precios[i],i);
    }
    --cont;
  }
  string check(vector <int> price, int budget, int k) {
    n = price.size();
    K = k;
    b = budget;
    ans = true;
    cont = 0;
    for(int i = 0; i < n and ans; ++i) ans &= (this -> check(price,price[i],i));
    return ans ? "YES" : "NO";
  }
};

This is what I'm getting:

C:\Users\Usuario\Desktop\Temp\C++\tc.cpp: In member function `std::string CucumberMarket::check(std::vector<int, std::allocator<int> >, int, int)':
C:\Users\Usuario\Desktop\Temp\C++\tc.cpp:24: error: no match for 'operator&=' in '((CucumberMarket*)this)->CucumberMarket::ans &= CucumberMarket::check(std::vector<int, std::allocator<int> >, int, int)(vector<int,std::allocator<int> >(((const std::vector<int, std::allocator<int> >&)((const std::vector<int, std::allocator<int> >*)(&price)))), (&price)->std::vector<_Tp, _Alloc>::operator[] [with _Tp = int, _Alloc = std::allocator<int>](((unsigned int)i)), i)'
[Finished in 0.2s with exit code 1]

Line 24 is this:

for(int i = 0; i < n and ans; ++i) ans &= (this -> check(price,price[i],i));

I don't get it, why am I getting this? I have done this before and it's always compiled

Upvotes: 0

Views: 1066

Answers (2)

Tony Delroy
Tony Delroy

Reputation: 106068

Look at your error message: it's trying

ans &= check(..., int, int)

And that version of check returns a string. You need a boolean expression on the right hand side of &=

Upvotes: 2

Karthik T
Karthik T

Reputation: 31952

std::string CucumberMarket::check It seems to be under the assumption that check returns string. This is your issue, you are expected it to take the bool returning one.
If you want it to work correctly, simplest fix would be to force cast price[i] to long long as below

for(int i = 0; i < n and ans; ++i) ans &= (this -> check(price,(long long)price[i],i));

I would recommend your overloads dont be so close together signature wise.

Upvotes: 7

Related Questions