Я пытаюсь создать unordered_set
из Intervals
как определено ниже:
struct Interval {
unsigned int b; //begining index
unsigned int e; //end index
bool updated; //true if concat. initially false
int patternIndex; //pattern index. valid for single pattern
int proteinIndex; //protein index. for retrieving the pattern
};
struct Hash {
size_t operator()(const Interval &interval) const;
};
struct IntervalEquality {
bool operator == (Interval const &lhs, Interval const &rhs);
};bool IntervalEquality::operator == (Interval const &lhs, Interval const &rhs){
return ((lhs.b == rhs.b) && (lhs.e == rhs.e) && (lhs.proteinIndex == rhs.proteinIndex));
}
size_t Hash::operator()(const Interval &interval) const{
string temp = to_string(interval.b) + to_string(interval.e) + to_string(interval.proteinIndex);
return hash<string>()(temp);
}
unordered_set<Interval, Hash> test;
Здесь я объявляю ==
оператор в моем заголовочном файле и определение его в моем файле .cpp (как я успешно делаю для других операторов). Когда я компилирую приведенный выше код, я получаю ошибки о ==
оператор, требующий ровно одного аргумента. Например., 'bool IntervalEquality::operator==(const Interval&, const Interval&)' must take exactly one argument
Если я попытаюсь выбрать альтернативный маршрут и объявить а также определять ==
в моем заголовочном файле так:
bool operator == (Interval const& lhs, Interval const& rhs){
return (lhs.b == rhs.b) &&
(lhs.e == rhs.e) &&
(lhs.proteinIndex == rhs.proteinIndex);
}
Я получаю ошибки о нескольких определениях ==
У кого-нибудь есть идеи, как мне это решить? Помощь очень ценится!
Поместите это в шапку:
bool operator== (Interval const& lhs, Interval const& rhs);
Поместите это в файл .cpp:
bool operator== (Interval const& lhs, Interval const& rhs)
{
return (lhs.b == rhs.b) &&
(lhs.e == rhs.e) &&
(lhs.proteinIndex == rhs.proteinIndex);
}
В то время как вы можете создать равенство лямбда, в этом случае это равенство имеет смысл для общего равенства.
Единственное, о чем я должен быть осторожен, это то, что ваш ==
не полное равенство. Если один Interval
отличается только updated
или же patternIndex
от другого и имейте коллизию хешей, они будут молча перезаписывать другого.
Изменить IntervalEquality::operator==
в operator()
, Затем определите ваш unordered_set
вот так:
unordered_set<Interval, Hash, IntervalEquality> test;
Проблема в том, что вы определили, что должно быть областью имен operator==
как функция-член. Операторы равенства области имен получают 2 аргумента и сравнивают их. Операторы равенства функций-членов берут 1 аргумент и сравнивают его с классом, которому он принадлежит.