C++ std::sort的错误
我创建了一些Node类的实例和Node类的vector,然后我将这些实例推到vector中, 我创建了函数对象“ListCompare”来排序向量 但是,我在sort函数中得到错误“没有匹配函数用于调用类型为“ListCompare”的对象” 为什么我会出错 我写了下面的代码和错误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
#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();
}
};