2013-03-03 76 views
1

我需要定義矢量排序比較函數:排序性病的矢量::對

class Sched 
    { 
    public: 
    struct Op 
    { 
     // some data 
    }; 
    typedef std::pair<Op*,Clk> OpSchedule; 
    void genSched() { std::sort(m_mappedOp.begin(),m_mappedOp.end(),cmp)} 

    private: 
    std::vector<OpSchedule> m_mappedOp; 
    bool cmp(const OpSchedule& l,const OpSchedule& r) 
    { 
     return l.second< r.second; 
    } 

我得到的編譯錯誤:

function call missing argument list; use '&Sched::cmp' to create a pointer to member. 

有人能告訴我如何解決,什麼是錯誤的原因? 謝謝

+0

@jogojapan關於你的答案裏:我認爲這是對提問者(和其他有用的人誰發現這個問題)有多個答案,以不同的方式說同一件事。有時候,它可以幫助他們理解它來閱讀兩次。 – 2013-03-03 12:30:09

+0

@sftrabbit是啊..,但在這種情況下......我們的答案實在是太相似(而我只是因爲我實際上已經忘了包括在碼字'static' 6秒更快)。 – jogojapan 2013-03-03 12:32:46

回答

6

cmp是一個非static成員函數。必須在某個對象上調用它。爲了得到一個指向你需要做的錯誤說,&Sched::cmp該成員函數,但那麼你就需要將其綁定到類型Sched的一些對象†

但是,沒有理由爲cmp成非static所以就改成這樣:

static bool cmp(const OpSchedule& l,const OpSchedule& r) 
{ 
    return l.second < r.second; 
} 

然後,你可以把它作爲你現在正在做的事情。

†你可以用std::bind(&Sched::cmp, this, std::placeholders::_1, std::placeholders::_2)這樣做,將成員函數綁定到this

1

另一種選擇是將化妝的CMP功能類的外部和類的命名空間,這樣的

void genSched() 
    { 
     using namespace <classNmaespace>; 
     std::sort(m_mappedOp.begin(),m_mappedOp.end(),cmp) 
    } 
+0

您能否解釋命名空間機制如何在這裏工作,或者爲什麼它是必需的? – jogojapan 2013-03-03 12:39:42

+0

在類內部使用cmp函數的問題在於,要訪問cmp函數,sort方法必須創建一個對象才能訪問它。現在,如果cmp方法在全局範圍內(如c函數),則可以通過排序方法訪問它,而無需使用對象。 – Pradheep 2013-03-03 12:43:18

+0

使排序方法變爲全局不是一個好主意。它打破了C++封裝。所以它必須在類的名稱空間內。因此,代碼將類似於std :: sort(m_mappedOp.begin(),m_mappedOp.end(),namespacename :: cmp) – Pradheep 2013-03-03 12:45:06