我正在查看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 :(得分: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) { }
保证常量