3

以下に定義されているように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 ファイルで定義しています (他の演算子でうまく行っているように)。上記のコードをコンパイルすると、==引数が 1 つだけ必要な演算子に関するエラーが発生します。例えば、'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); 
}

複数の定義に関するエラーが表示されます==

これを解決する方法を知っている人はいますか? 大変助かりました!

4

2 に答える 2

3

を に変更IntervalEquality::operator==operator()ます。次に、unordered_set好きなように定義します:

unordered_set<Interval, Hash, IntervalEquality> test;

問題は、名前空間スコープであるべきものをoperator==メンバー関数として定義したことです。名前空間スコープの等価演算子は 2 つの引数を取り、それらを比較します。メンバー関数の等価演算子は、1 つの引数を取り、それを所属するクラスと比較します。

于 2013-04-08T01:52:37.973 に答える
1

これをヘッダーに入れます:

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と異なるだけでupdatedpatternIndexハッシュの衝突がある場合、それらは暗黙のうちに他方を上書きします。

于 2013-04-08T02:17:20.627 に答える