2021年5月6日星期四

illegal expression and const_Hasher lose

Can someone explain to me why these two errors come out?

The error shows that C2056: illegal expression and error C3849: function-style call on an expression of type 'const _Hasher' would lose const and/or volatile qualifiers for all 2 available operator overloads

Am I missing some part in here?

some unknown errors come out. can someone fix this problem?

class myCompareClass {      //For all comparions, compare the sums of all int objects in the structures.      //For Hashing function use h(sums int in the sturcture), where hash<int> h;  public:      bool operator()(int* p1, int* p2) const { return *p1 < *p2; }//set      bool operator()(list<set<int*, myCompareClass>*>* p1, list<set<int*, myCompareClass>*>* p2) {          int sum1{ 0 }, sum2{ 0 };          for (auto i : *p1) {              for (auto j = *i->begin(); j != *i->end(); i++) {                  sum1 += *j;              }          }            for (auto i : *p2) {              for (auto j = *i->begin(); j != *i->end(); i++) {                  sum2 += *j;              }          }            return sum1 < sum2;      }      bool operator() (const map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >& M1,          const map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >& M2)  const {          int sum1{ 0 }, sum2{ 0 };          for (auto i : M1) {              auto& L = *i.first;              auto& R = *i.second;              for (auto a:L)              {                  for (auto w : *a) {                      sum1 += *w;                  }              }              for (auto e : R) {                  sum1 += *e;              }          }                    for (auto i : M2) {              auto& L = *i.first;              auto& R = *i.second;              for (auto a : L)              {                  for (auto w : *a) {                      sum2 += *w;                  }              }              for (auto e : R) {                  sum2 += *e;              }          }            return sum1 < sum2;        }  };    class myCompareClass1 {      //Need a functor for ==      //For Hashing function use h(sums int in the sturcture), where hash<int> h;  public:        bool operator() (const map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >& M1,          const map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >& M2)  const {          int sum1{ 0 }, sum2{ 0 };          for (auto Q = M1.begin(); Q != M1.end(); Q++) {              auto& W = Q->first;              auto& E = Q->second;              for (auto R = *W->begin(); R != *W->end(); R++) {                  for (auto T = *R->begin(); T != *R->end();T++) {                      sum1 += *T;                  }              }            }            for (auto Q = M2.begin(); Q != M2.end(); Q++) {              auto& W = Q->first;              auto& E = Q->second;              for (auto R = *W->begin(); R != *W->end(); R++) {                  for (auto T = *R->begin(); T != *R->end(); T++) {                      sum2 += *T;                  }              }            }          return sum1 == sum2;        }        size_t operator()(const map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >& M1) {          int sum{ 0 };          for (auto i : M1) {              auto& Q = i.first;              auto& W = i.second;              for (auto E : *Q) {                  for (auto R : *E) {                      sum += *R;                  }              }              for (auto T : *W) {                  sum += *T;              }          }          hash<int> h;          return h(sum);        }  };  //You need to implement overloaded operator<< .    ostream& operator<< (ostream& str, const set<map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >, myCompareClass>& S) {      str << "<";      for (auto i = S.begin(); i != S.end(); i++) {          str << "{";          for (auto q : *i) {              str << "[";              auto w = q.first;              auto e = q.second;              for (auto a : *w) {                  str << "<";                  for (auto s : *a) {                      str << *s << " ";                  }                  str << ">";              }              str << "]";              str << "(";              for (auto p : *e) {                  str << *p << " ";              }              str << ")";          }          str << "}";      }      str << ">";      return str;  }    ostream& operator<< (ostream& str, const unordered_set< map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >, myCompareClass1, myCompareClass1>& H) {      str << "<";      for (auto i : H) {          str << "{";          for (auto a : i) {              auto& Q = a.first;              auto& W = a.second;              str << "[";              for (auto E : *Q) {                  str << "<";                  for (auto R : *E) {                      str << *R << " ";                  }                  str << ">";              }              str << "]";              str << "(";              for (auto T : *W) {                  str << *T << " ";              }              str << ")";          }          str << "}";      }      str << ">";      return str;  }    int main() {        set<map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >, myCompareClass> S{              {                      {new list<set<int*, myCompareClass>*>                      {new set<int*, myCompareClass>                      {new int{10},new int{20} ,new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}},                      {new list<set<int*, myCompareClass>*>                      {new set<int*, myCompareClass>                      {new int{10},new int{20}, new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}}              },              {                      {new list<set<int*, myCompareClass>*>                      {new set<int*, myCompareClass>                      {new int{10},new int{20}, new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}},                      {new list<set<int*, myCompareClass>*>                      {new set<int*, myCompareClass>                      {new int{10},new int{20}, new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}}              }      };        cout << S << endl;      unordered_set< map < list<set<int*, myCompareClass>*>*, vector<int*>*, myCompareClass >, myCompareClass1, myCompareClass1> H{                  {                          {new list<set<int*, myCompareClass>*>                          {new set<int*, myCompareClass>                          {new int{10},new int{20},new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}},                          {new list<set<int*, myCompareClass>*>                          {new set<int*, myCompareClass>                          {new int{10},new int{20},new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}}                  },                  {                          {new list<set<int*, myCompareClass>*>                          {new set<int*, myCompareClass>                          {new int{10},new int{20},new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}},                          {new list<set<int*, myCompareClass>*>                          {new set<int*, myCompareClass>                          {new int{10},new int{20},new int {30}}}, new vector<int*>{new int{10},new int{20},new int {30}}}                  }      };      cout << H << endl;      return 0;  }  
https://stackoverflow.com/questions/67428504/illegal-expression-and-const-hasher-lose May 07, 2021 at 11:05AM

没有评论:

发表评论