用于排序的比较器

时间:2013-03-13 12:32:23

标签: c++ visual-c++

我正在查看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接受?

4 个答案:

答案 0 :(得分:5)

您需要将您的成员函数设置为静态才能被sort访问。 在您的班级标题中,请将其声明为:

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

没有必要使用bind,因为您的比较器很可能(或不应该)需要访问类成员。

答案 1 :(得分:1)

您无法使用成员函数。使clauseComparator成为自由函数或static成员函数。

您的比较器也应该通过const引用接受参数。

答案 2 :(得分:0)

您必须使用std::bind将成员函数绑定到std::sort,因为否则无法将成员函数绑定到std::sort

所以它想要这样:

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

答案 3 :(得分:0)

因为std :: sort(这是这种,对吧?)被声明为

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) { }

保证常量