1. ホーム
  2. c++

[解決済み] C2678 二項演算子 '<': 左側のオペランドが 'const Node' 型である演算子が見つかりません (または、受け入れ可能な変換がありません) [重複] 。

2022-02-12 20:01:13

質問

地図がどのように機能するのか、またグラフにどのように実装するのかを学んでいます。上のようなエラーが出続けています。これは、'<'が、想定していないデータより少ないデータを取っているためだと思います。

using namespace std;


struct Node {
    string name;
    int val;

    Node(string n) {
        name = n;
        val = 0;
    }

};

struct AdjList {

    map<Node, list<Node*>> adj;
    map<Node, list<Node*>>::iterator it;
    int type; 

    AdjList(int a) {
        type = a;
    }


    void add(Node temp) {
        it = adj.end();
        list <Node*> hi;
        adj.insert(pair <Node, list <Node*>>(temp, hi));
    }

    void connect(Node *a, Node *b) {
        adj.find(*a)->second.push_back(b);
        if (type == 1) {
            adj.find(*b)->second.push_back(a);
        }
    }

    void connect(Node *a, vector <Node*> b) {
        for (int i = 0; i < b.size(); i++) {
            connect(a, b[i]);
        }
    }
};

解決方法は?

を定義していないため、エラーになります。 operator< に対して Node クラスを (メソッドとして、あるいは非メンバー関数として) 作成します。

見てみましょう 演算子のオーバーローディングはこちら 以来 map はキーをソートして格納するため、これらの実装が必要です。 operator< を使用します。

実装例としては val で、次に name というように実装することになります。

#include <tuple>

inline bool operator==(const Node& lhs, const Node& rhs){
    return lhs.val == rhs.val && lhs.name == lhs.name;
}
inline bool operator!=(const Node& lhs, const Node& rhs){return !operator==(lhs,rhs);}
inline bool operator< (const Node& lhs, const Node& rhs){
    // std::tuple's lexicographic ordering does all the actual work for you
    // and using std::tie means no actual copies are made
    return std::tie(lhs.val, lhs.name) < std::tie(rhs.val, rhs.name);
}
inline bool operator> (const Node& lhs, const Node& rhs){return  operator< (rhs,lhs);}
inline bool operator<=(const Node& lhs, const Node& rhs){return !operator> (lhs,rhs);}
inline bool operator>=(const Node& lhs, const Node& rhs){return !operator< (lhs,rhs);}