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
没有评论:
发表评论