【问题标题】:C2678 binary '<': no operator found which takes a left-hand operand of type 'const Node' (or there is no acceptable conversion) [duplicate]C2678二进制“<”:未找到采用“const Node”类型左侧操作数的运算符(或没有可接受的转换)[重复]
【发布时间】:2017-03-17 17:38:04
【问题描述】:

我正在尝试了解地图的工作原理以及如何为图表实现它们。我不断收到上面的错误。我认为这是因为“

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

【问题讨论】:

    标签: c++ dictionary


    【解决方案1】:

    出错是因为您没有为您的 Node 类定义 operator&lt;(作为方法或作为非成员函数)。

    看看here for operator overloading;由于map 按排序顺序存储键,它们必须实现operator&lt; 才能使用。

    一个示例实现可能是先按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);}
    

    【讨论】:

    • 必须定义将您的类用作std::map键的唯一运算符是&lt;——其他可能对您有用但不会使用std::map
    • @ChrisDodd:Yar。我实现了所有其他的,因为不这样做会使你的类更难被其他程序员使用,实现所有这些是一个好习惯,但就像我说的,map 需要operator&lt;(我只是没有说清楚关心operator&lt;)。应始终抓住任何机会来说明根据operator==operator&lt; 定义其他四个操作是多么容易。 :-)
    • 我不太明白你如何“排序”对象。它会根据对象的地址进行排序吗?如果在这种情况下 Node 为空,“
    • @lyph:你为什么要把空的Nodes 放在map 中?排序是您定义的任何内容,这就是重点。我的示例按val 排序,然后按name 排序,但您可以重新定义它。
    • @ShadowRanger 我只是想知道概念的缘故。哦,所以如果两个 val 相等,它会比较字符串?
    猜你喜欢
    • 1970-01-01
    • 2011-12-09
    • 2015-11-18
    • 1970-01-01
    • 2014-12-04
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多