在用户定义的对象上调用std :: find时出错

时间:2013-05-14 13:46:09

标签: c++ iterator find hashtable operator-keyword

所以我不断收到错误消息:

  

'(& __ first)> std :: _ List_iterator< _Tp> :: operator * with _Tp = Course == __val'

中的'operator =='不匹配

在以下代码中:

int main(){
  Course NOT_FOUND("NOT_FOUND", "NOT_FOUND", 0);
  Course x("COMP2611", "COMPUTER ORGANIAZTION", 2);
  HashTable<Course> q(NOT_FOUND, 17, 36);

  q.insert(x);
}



template <class HashedObj>
class HashTable{
public:
  HashTable(const HashedObj& notFound, int bucket, int base);
  void insert(const HashedObj& x);

private:
  const HashedObj ITEM_NOT_FOUND;
  vector<list<HashedObj> > theList;
};

template <class HashedObj>
void HashTable<HashedObj>::insert(const HashedObj& x){
  list<HashedObj>& whichList = theList[hash(x)];
  typename list<HashedObj>::iterator itr;
  itr = std::find(theList[0].begin(), theList[0].end(), x);
  if(itr == theList[hash(x)].end())
    whichList.insert(theList[hash(x)].begin(), x);
}

我测试并了解错误来自

itr = std::find(theList[0].begin(), theList[0].end(), x);

但我不知道该怎么做才能修复它。我想我只是在打电话 标准查找功能在这里,但显然它不起作用。

我认为课程课程是正确定义的,因为我之前在其他课程中进行了测试。

代码是:

class Course{
public:
Course(string code, string name, int credit):
    _code(code), _name(name), _credit(credit){}

string _code;

private:
string _name;
int _credit;

friend int hash(Course x);
};


int hash(Course x){
    int sum = 0;
    for(int i = 0; i < x._name.size(); i++)
        sum+=_name[i];

    return sum % 35;
}

1 个答案:

答案 0 :(得分:2)

find使用operator==将您要查找的参数与迭代器的值进行比较。您的Course班级没有此类operator==。你需要实现它。

class Course {
public:
  // bla bla
  friend
  bool operator==(const Course& x, const Course& y)
  { return your-comparison-code-here; }
};

James Kanze指出:您也可以使用std::find_if并提供比较函数/ lambda。