LoginSignup
1
0

More than 5 years have passed since last update.

unordered_map のキーに自作クラスを設定したとき、erase メソッドが使えないときの対処法 (かと思ったらただのミス)

Last updated at Posted at 2018-10-08

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;
}

結局の所

エラーメッセージと該当箇所をよく読んだら分かる話でした。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0