Visual c + + 2012:为什么priority_queue需要重载赋值运算符?

时间:2013-08-25 14:25:46

标签: c++ visual-c++

我正在尝试用c ++实现A *搜索功能,而我在优先级队列方面遇到了很多麻烦。从我在网上找到的例子来看,似乎只需要定义一个带有重载“()”的比较器类;但是,似乎Visual C ++编译器希望为优先级队列的元素定义赋值运算符“=”,否则它会生成一条错误消息:

错误C2582:'node'中的'operator ='功能不可用

指向源代码中实现<algorithm>库的行。

所以我继续为'node'类编写一个重载的'='操作,只是发现“push”操作在某个时刻执行了赋值,所以我最终得到了一个相同'node'对象的队列

我在这里错过了什么吗?

以下是相关代码

node.h

#include <string>
#include <ostream>
//node used in the A* search
struct node{
public:
    friend void operator<<(std::ostream& o,node& n);
    node(std::string& s):msg(s),gScore(0),hScore(0),parent(nullptr){};
    int getHeuristics( node& n);
    bool operator==(node n){return n.msg.compare(msg)?false:true;};
    node& operator=(node& n){msg = n.msg;gScore = n.gScore;hScore = n.hScore; return *this;};
    void setG(int g){gScore = g;}
    int getG(void) {return gScore;}
    int getH(void) {return hScore;}
    int getOverall(void){return hScore + gScore;}
    node* getParent(void){return parent;}
    std::string& msg;
private:
    node* parent;
    int gScore;
    int hScore;
};

WordLadder.c(部分内容;“比较器”只是以某种方式比较节点):

    string apple("apple");
    string shite("shite");
    string germanApple("apfel");
    node germanNode(germanApple);
    node a(apple);
    node b(shite);
    a.getHeuristics(germanNode);
    b.getHeuristics(germanNode);
    priority_queue<node,vector<node>,comparitor> p;
    p.push(a);
    //cout<<b;
    p.push(b);
    cout<<b; //prints "apple"

2 个答案:

答案 0 :(得分:3)

std::string& msg;

msg = n.msg;

这就是你的问题。您需要std::string msg,副本,而不是参考。

答案 1 :(得分:0)

priority_queue<...>::push使用(有效)push_heap算法。 push_heap算法要求元素可以复制。因此,priority_queue<...>::push要求元素可以复制。

您的问题源于存储引用,这些引用没有正确的赋值语义。分配它们时,它会指定引用,它不会重新引用引用。如果你想要可重新绑定的引用,那么使用指针。