Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::sort的错误_C++_Sorting_Std - Fatal编程技术网

C++ std::sort的错误

C++ std::sort的错误,c++,sorting,std,C++,Sorting,Std,我创建了一些Node类的实例和Node类的vector,然后我将这些实例推到vector中, 我创建了函数对象“ListCompare”来排序向量 但是,我在sort函数中得到错误“没有匹配函数用于调用类型为“ListCompare”的对象” 为什么我会出错 我写了下面的代码和错误 #include <iostream> #include "cocos2d.h" using namespace cocos2d; class Node { public: Node(int

我创建了一些Node类的实例和Node类的vector,然后我将这些实例推到vector中, 我创建了函数对象“ListCompare”来排序向量

但是,我在sort函数中得到错误“没有匹配函数用于调用类型为“ListCompare”的对象”

为什么我会出错

我写了下面的代码和错误

#include <iostream>
#include "cocos2d.h"

using namespace cocos2d;

class Node
{

public:
    Node(int x,int y,CCPoint playerTilePos): m_tilePosX(x),m_tilePosY(y),m_costFromStart(0),m_costFromNextToGoal(0),m_playerTilePos(playerTilePos){};
    Node(const Node &obj);
    virtual ~Node(){};

    int getPosX(void) const { return m_tilePosX; }
    int getPosY(void) const { return m_tilePosY; }

    int getTotalCost(void) const { return m_costFromStart + m_costFromNextToGoal; }

    int getConstFromStart(void) const { return m_costFromStart; }
    void setCostFromStart(int var) { m_costFromStart = var; }

    int getCostFromNextToGoal(void)const { return ( std::abs((int)m_playerTilePos.x - m_tilePosX) + std::abs((int)m_playerTilePos.y - m_tilePosY) );}
    void setCostNextToGoal(int var) { m_costFromNextToGoal = var; }


    bool operator == (Node node)
    {
        return (m_tilePosX == node.m_tilePosX && m_tilePosY == node.m_tilePosY);
    }



    void operator = (Node node)
    {
        m_tilePosX = node.m_tilePosX;
        m_tilePosY = node.m_tilePosY;
        m_costFromStart = node.m_costFromStart;
        m_costFromNextToGoal = node.m_costFromNextToGoal;
    }





private:

    int m_tilePosX;
    int m_tilePosY;     
    int m_costFromStart; 
    int m_costFromNextToGoal; 
    CCPoint m_playerTilePos;
};


std::vector<Node>List;



class ListCompare{
public:
   bool operator()(Node& pNode1,Node& pNode2)
   {
            return pNode1.getTotalCost() > pNode2.getTotalCost();
   }
};








//--------------------------------------------------------------
//             START 
//--------------------------------------------------------------

void main()
{

  List openList;

  //initialize
  CCPoint pos = ccp(100,100);

  Node startNode(10,10,pos);

  //cost is 1000
  startNode.setCostNextToGoal(1000);

  std::cout << startNode.getTotalCost << std::endl; //totalcost = 0 + 1000 = 1000

  openList.pushBack(startNode);  



  Node nextNode(20,20,pos);

  NextNode.setCostNextToGoal(2000);

  std::cout << NextNode.getTotalCost << std::endl; //totalcost = 0 + 2000 = 2000


  openList.pushBack(NextNode);


  std::sort(openList.begin(),openList.end(),ListCompare());

 }
#包括
#包括“cocos2d.h”
使用名称空间cocos2d;
类节点
{
公众:
节点(int x,int y,CCPoint playerTilePos):m_tilePosX(x),m_tilePosY(y),m_costfrom start(0),m_costfrom nextto goal(0),m_playerTilePos(playerTilePos){};
节点(常量节点和对象);
虚拟~Node(){};
int getPosX(void)常量{return m_tilePosX;}
int getPosY(void)常量{return m_tilePosY;}
int getTotalCost(void)const{return m_costFromStart+m_costFromNextToGoal;}
int getConstFromStart(void)const{return m_costFromStart;}
void setCostFromStart(int-var){m_costFromStart=var;}
int getCostFromNextToGoal(void)const{return(std::abs((int)m_playerTilePos.x-m_tilePosX)+std::abs((int)m_playerTilePos.y-m_tilePosY));}
void setCostNextToGoal(int-var){m_costFromNextToGoal=var;}
布尔运算符==(节点)
{
返回(m_tilePosX==node.m_tilePosX&&m_tilePosY==node.m_tilePosY);
}
void运算符=(节点)
{
m_tilePosX=node.m_tilePosX;
m_tilePosY=node.m_tilePosY;
m_costFromStart=node.m_costFromStart;
m_costFromNextToGoal=node.m_costFromNextToGoal;
}
私人:
int m_tilepox;
国际博物馆;
int m_costFromStart;
下一个目标的综合成本;
m_playerTilePos中心;
};
向量表;
类列表比较{
公众:
布尔运算符()(节点和pNode1,节点和pNode2)
{
返回pNode1.getTotalCost()>pNode2.getTotalCost();
}
};
//--------------------------------------------------------------
//             开始
//--------------------------------------------------------------
void main()
{
列表开放列表;
//初始化
ccp点位置=ccp(100100);
节点起始节点(10,10,位置);
//费用是1000英镑
startNode.setCostNextToGoal(1000);

std::cout在
ListCompare::operator()
中,您需要将参数作为常量引用

class ListCompare
{
public:
    bool operator()(const Node& pNode1, const Node& pNode2) const
    {
        return pNode1.getTotalCost() > pNode2.getTotalCost();
    }
};

请发布一些复制问题的最小代码。但是,在
std::sort
中使用它之前,请确保定义了
ListCompare
,并将相关签名更改为
bool操作符()(const Node&pNode1,const Node&pNode2)const
如果使用,
节点
类中的赋值和复制构造函数,将显示未定义的行为。您无法复制
CCPoint
成员,因此即使更改为使用const引用作为参数,std::sort也无法正常工作。感谢您的回答。很抱歉,答复太晚了。我忘记了在我的代码中定义了复制构造函数。当我改为使用const引用时,我解决了错误。谢谢你的回答。我没有注意到我没有写“const”。很抱歉打扰你。
class ListCompare
{
public:
    bool operator()(const Node& pNode1, const Node& pNode2) const
    {
        return pNode1.getTotalCost() > pNode2.getTotalCost();
    }
};