20181008 追記
コメントにてpegacornさんにご指摘いただいた通り、const修飾をしたら難なくコンパイルが通りました!
問題のコードの演算子オーバーロード部を以下の通り記述すればOKです。
bool operator==(const Color &arg) const {
return this->r == arg.r && this->g == arg.g && this->b == arg.b;
}
大変お騒がせいたしました。一応教訓ということでこの記事は残させていただきます。(一応僕の方法でも正規ではないですがコンパイルは通ります、確実に非推奨だと思いますが...)
pegacornさん、ありがとうございました!
症状
unorderd_setやunorderd_mapのキーに任意のクラスを渡すや、自作クラスをunordered_mapに突っ込むという記事を参考にさせていただき、unordered_mapのキーに自作クラスを設定したが、このクラスのインスタンスでerase(hoge)
メソッドを呼んだとき、 Invalid operands to binary expression
というエラーが発生した。
環境
Xcode 10.0
clang-1000.11.45.2
問題のコード
色情報の整数値 r, g, b をフィールドにもつクラスを想定
include
using
は適当にお願いします
class Color {
public:
int r;
int g;
int b;
// コンストラクタ
Memo() {
r = g = b = 0;
}
// 記事を参考に演算子オーバーロード
bool operator!=(const Color &arg) {
return !(*this == arg);
}
};
// 記事を参考にハッシュ関数を実装
namespace std{
template<>
class hash<Memo>{
public:
size_t operator()(const Color &color) const {
size_t seed = 0;
auto r_hash = hash<int>()(color.r);
auto g_hash = hash<int>()(color.g);
auto b_hash = hash<int>()(color.b);
seed ^= r_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
seed ^= g_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
seed ^= b_hash + 0x9e3779b9 + (seed << 6) + (seed >> 2);
return seed;
}
};
}
問題点
erase(hoge)
はどうやら、
bool operator==(const Color &left, const Color &right) {};
という、引数を2つ取る演算子を利用するらしく、これが未定義のためにメソッドが解決できなかった。
対処法
以下の記述を追加
bool operator==(const Color &left, const Color &right) {
return left.r == right.r && left.g == right.g && left.b == right.b;
}
結局の所
エラーメッセージと該当箇所をよく読んだら分かる話でした。