C2678二进制'<&#39 ;:找不到哪个运算符采用类型' const Node'的左手操作数。 (或者没有可接受的转换)

时间:2016-11-04 00:09:48

标签: c++ dictionary

我试图了解地图如何工作以及如何为图表实现它们。我一直收到上面的错误。我认为这是因为'<'比不想要的数据要少。

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

1 个答案:

答案 0 :(得分:4)

错误输出是因为您没有为operator<类定义Node(作为方法或非成员函数)。

看看here for operator overloading;由于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);}