2014-07-05 82 views
-2

的錯誤我創建了Node類的一些實例和Node類的向量,然後我將這些實例推入向量, ,我創建了函數對象「ListCompare」對向量進行排序。std :: 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()); 

} 

--------------------------------錯誤--------- -------------------------

template<typename _Tp, typename _Compare> 
    inline const _Tp& 
    __median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) 
    { 
     // concept requirements 
     __glibcxx_function_requires(_BinaryFunctionConcept<_Compare,bool,_Tp,_Tp>) 

     if (__comp(__a, __b)) //the error part."No matching function for call to object of type "ListCompare" " 
    if (__comp(__b, __c)) 
     return __b; 
    else if (__comp(__a, __c)) 
     return __c; 
    else 
     return __a; 
    else if (__comp(__a, __c)) 
     return __a; 
    else if (__comp(__b, __c)) 
     return __c; 
    else 
     return __b; 
} 
+1

請張貼一些最小的代碼來重現問題。但是,確保'ListCompare'是在std :: sort'中使用之前定義的,並將相關簽名更改爲'bool operator()(const Node&pNode1,const Node&pNode2)const' – juanchopanza

+0

您的賦值和拷貝構造函數在如果使用'Node'類將顯示未定義的行爲。您無法複製'CCPoint'成員,因此,即使您更改爲使用const引用作爲參數,std :: sort也無法正常工作。 – PaulMcKenzie

+0

謝謝你的回答。很抱歉,答覆遲到了。我忘了在我的代碼中定義複製構造函數。當我更改爲使用const引用時,我解決了錯誤。 – user3321541

回答

2

ListCompare::operator()您需要將參數作爲常量引用。

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

謝謝你的回答。我沒有注意到我沒有寫「const」,我很抱歉給你造成麻煩。 – user3321541

相關問題