我正在解决Leetcode OJ中的一个问题。我写了这样一个解决方案:为什么std :: sort()需要静态比较函数?
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
bool comparefunc (const Interval& a, const Interval& b) {
return a.start < b.start;
}
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> result;
if(intervals.empty()) return result;
// sort Interval vector on increasing order of start
sort (intervals.begin(), intervals.end(), comparefunc);
// some other stuffs
result.push_back(intervals[0]);
for(int i = 1; i < intervals.size(); ++i) {
if(intervals[i].start > result.back().end) result.push_back(intervals[i]);
else result.back().end = max(result.back().end, intervals[i].end);
}
return result;
}
};
而这会产生编译错误:
no matching function for call to
'sort(std::vector<Interval>::iterator, std::vector<Interval>::iterator, <unresolved overloaded function type>)'
然后我(在其他的解决方案锯)与static
改变comparefunc
签名一样:
static bool comparefunc (const Interval& a, const Interval& b) {
return a.start < b.start;
}
它的工作!我的问题是 - 为什么它需要是static
?
由于非静态成员函数具有用于'this'一个隐含的第一参数。这是他们如何访问其他成员。 – juanchopanza 2014-09-30 22:21:23
@ juanchopanza更多解释请!请发表回答 – 2014-09-30 22:25:14
由于与Solution的成员函数外部相同的原因,您不能在不指定“Solution”实例的情况下调用非静态函数comparefunc。也就是说,'Solution :: comparefunc(a,b)'在语法上不是有效的。 '&Solution :: comparefunc'是一个“指向成员函数的指针”(例如,参见http://www.parashift.com/c++-faq/pointers-to-members.html)。 – rici 2014-09-30 22:32:18