2013-03-13 156 views
4

我在看http://www.cplusplus.com/reference/algorithm/sort/並希望實現類似的功能:我定義了一個函數clauseComparator,它與所提供的鏈接中的示例中給出的myfunc相似。比較器與排序一起使用

bool QueryEvaluatorPrivate::clauseComparator(QueryClause cl1, QueryClause cl2) { 
    int priority1 = clausePriority(cl1), 
     priority2 = clausePriority(cl2); 
    return priority1 < priority2; 
} 

,我用它像:

sort(clauses.begin(), clauses.end(), clauseComparator); 

但是VS抱怨:

Error 4 error C3867: 'QueryEvaluatorPrivate::clauseComparator': function call missing argument list; use '&QueryEvaluatorPrivate::clauseComparator' to create a pointer to member h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp 138 
Error 5 error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp 138 

首先什麼是錯(ARG失蹤名單)?我試圖按照錯誤給加&建議,並結束了與

Error 4 error C2276: '&' : illegal operation on bound member function expression h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp 138 
Error 5 error C2780: 'void std::sort(_RanIt,_RanIt)' : expects 2 arguments - 3 provided h:\dropbox\sch\cs3202\code\source\query\query evaluator\queryevaluator.cpp 138 

請告訴我錯在這裏?在我的理解中,它應該傳遞一個函數指針,我知道它也應該被sort接受?

+0

我不認爲你可以使用類的成員函數作爲比較器。 – sgarizvi 2013-03-13 12:34:36

回答

5

您需要將您的會員功能設爲靜態才能通過sort訪問。 在你的類的頭,請聲明它是這樣:

static bool QueryEvaluatorPrivate::clauseComparator(const QueryClause & cl1, const QueryClause & cl2);

沒有必要使用bind,因爲你最有可能(或應該)比較有任何需要訪問類的成員。

+1

靜態?沒有必要,它可能只是全局功能 – 4pie0 2013-03-13 12:50:21

+0

除非你有充分的理由,否則不需要污染全局命名空間。合格的方法提供上下文,所以我推薦使用靜態成員比較器。 – 2013-03-13 12:58:39

+0

這不是「需要」,您可能希望將其更改爲「can」 – 4pie0 2013-03-13 13:30:25

0

你必須使用std::bind的成員函數綁定到std::sort因爲你,否則不能在成員函數綁定到std::sort

所以它會是這樣的:

sort(clauses.begin(), clauses.end(), std::bind(&QueryEvaluatorPrivate::clauseComparator, instance, args)); 
1

不能使用成員函數爲此。使clauseComparator成爲免費函數或static成員函數。

你的比較器還應該通過const引用接受參數。

0

因爲的std ::排序(這是這種吧?)被聲明爲

template <class RandomAccessIterator> 
    void sort (RandomAccessIterator first, RandomAccessIterator last); 


template <class RandomAccessIterator, class Compare> 
    void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); 

所以函數comp必須是:

接受範圍內的兩個元素二元函數作爲參數, 並返回一個可轉換爲bool的值。返回的值表示 作爲第一個參數傳遞的元素是否會在第二個元素之前的 之前被指定爲它所定義的特定嚴格弱排序。函數不得修改其任何參數。這可以是一個 函數指針或函數對象。

所以請使其全局函數

bool myfunction (QueryClause q1,QueryClause q2) { return (//condition); } 

或聲明函子:

struct myclass { 
    bool operator() (QueryClause q1,QueryClause q2) { return (//condition again);} 
} myobjectcomparator; 

,你需要:

QueryClause(const QueryClause &qc) { } 

保證常量性