C ++试图将优先级队列与自定义类一起使用,编译器在尝试填充队列时抛出错误

时间:2014-03-11 23:25:04

标签: c++

我正在尝试在c ++中创建一个2d整数的A *搜索(我对c ++很新,但我已经在Java中完成了一次)问题是当我试图将项目推入队列时由于类型冲突而抛出编译错误。

我的Node.h定义为:

class Node{

private:

    int xCoord;
    int yCoord;
    int value;
    Node* parent;

public:

    Node();
    Node(int x, int y, int value);
    void setParent(Node* parent);
    int getX();
    int getY();
    int getValue();
    Node* getParent();
    bool operator()(Node& node1, Node& node2);

};

struct NodeCompare {

    bool operator()(Node& node1, Node& node2) const
    {
        int node1value = node1.getValue();
        int node2value = node2.getValue();
        return node1value < node2value;
    }
};

Node.cpp:

#include <stdlib.h>

#include "Node.h"

Node::Node(){

    this->xCoord = -1;
    this->yCoord = -1;
    this->value = -1;
    this->parent = NULL;

}

Node::Node(int _x, int _y, int _value){

    this->xCoord = _x;
    this->yCoord = _y;
    this->value = _value;
    this->parent = NULL;

}

void Node::setParent(Node* par){

    this->parent = par;

}

int Node::getX(){

    return xCoord;

}

int Node::getY(){

    return yCoord;

}

int Node::getValue(){

    return value;

}

Node* Node::getParent(){

    return parent;
}

bool Node :: operator()(Node&amp; node1,Node&amp; node2){

return node1.value > node2.value;

}

和我的主要:

#include <iostream>
#include <ostream>
#include <vector>
#include <queue>

#include "Node.h"

int main(){

    using namespace std;

    priority_queue<Node, vector<Node>, NodeCompare> openList;

    Node* node = new Node(1,2,19);

    openList.push(node);

    cout << "node is: x " << node->getX() << " y " << node->getY() << " value "
            << node->getValue() << endl;



    return 0;

}

编译器说:

error: no matching function for call to ‘std::priority_queue<Node, std::vector<Node>, NodeCompare>::push(Node*&)’

这与我想要推送到列表的Node的类型有关(所以我相信)我尝试将我的代码更改为以下内容:

Node node = new Node(1,2,19);

给出错误:

error: conversion from ‘Node*’ to non-scalar type ‘Node’ requested

我试过传递我知道的所有变化:

openList.push(&node);

openList.push(*node);

但是他们也会抛出编译错误。

有人可以解释我做错了吗?

干杯, 克里斯。

2 个答案:

答案 0 :(得分:1)

当您的优先级队列被声明为保持时,

new返回指向对象的指针 实际的对象。您可以像这样更改main,而不是处理Node对象 指向堆上Node的指针:

int main(){

    using namespace std;

    priority_queue<Node, vector<Node>, NodeCompare> openList;

    Node node = Node(1,2,19);

    openList.push(node);

    cout << "node is: x " << node.getX() << " y " << node.getY() << " value "
            << node.getValue() << endl;



    return 0;

}

答案 1 :(得分:1)

您正在尝试将节点指针添加到节点对象列表中。我建议的是openList.push(*node);