5

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

4 回答 4

6

您需要将您的成员函数设为静态才能被sort. 在你的类头文件中,请这样声明:

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

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

于 2013-03-13T12:35:31.060 回答
1

您不能为此使用成员函数。做clauseComparator一个自由函数或static成员函数。

您的比较器还应该通过 const 引用获取参数。

于 2013-03-13T12:35:29.953 回答
0

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

所以它会这样:

 sort(clauses.begin(), clauses.end(), std::bind(&QueryEvaluatorPrivate::clauseComparator, instance, args));
于 2013-03-13T12:35:24.993 回答
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) { }

保证一致性

于 2013-03-13T12:54:12.110 回答