标题是主要问题。确切的场景(我'使用命名空间std;'):
void SubstringMiner::sortByOccurrence(list<Substring *> & substring_list) {
list::sort(substring_list.begin(), substring_list.end(), Substring::OccurrenceComparator);
}
这是比较器定义:
class Substring {
// ...
class OccurrenceComparator {
public:
bool operator() (Substring * a, Substring *b);
}
};
比较器的实现是直观而微不足道的。我也在std :: set中使用了一个非常相似的比较器,它工作正常。当我添加sortByOccurrence()函数时,它会在标题中给出错误。
我该怎么办?
编辑:我现在正在尝试将Substring :: OccurrenceComparator()作为比较器传递,并收到以下错误:
g++ -Wall -g -c substring_miner.cpp -o obj/subtring_miner.o
substring_miner.cpp: In function ‘void SubstringMiner::sortByOccurrence(std::list<Substring*, std::allocator<Substring*> >&)’:
substring_miner.cpp:113: error: no matching function for call to ‘std::list<Substring*, std::allocator<Substring*> >::sort(std::_List_iterator<Substring*>, std::_List_iterator<Substring*>, Substring::OccurrenceComparator)’
/usr/include/c++/4.3/bits/list.tcc:303: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = Substring*, _Alloc = std::allocator<Substring*>]
make: *** [substring_miner] Error 1
我的代码行现在是:
list<Substring *>::sort(substring_list.begin(), substring_list.end(), Substring::OccurrenceComparator());
我无法移除模板,或者它给出了一个错误,指出模板参数错误。
答案 0 :(得分:4)
您将类作为参数传递给函数。你不能这样做 - 你必须创建一个类的实例,并传递:
substring_list.sort(Substring::OccurrenceComparator());
注意上面OccurenceComparator
之后的额外括号,它使用默认构造函数创建类的临时对象。
另一个错误是你在类list::sort
上调用std::list
作为静态函数。它不是静态的,因此您需要将其称为substring_list
上的成员函数。
答案 1 :(得分:4)
list
成员sort
是一个非静态函数,因此必须在列表实例上调用。
substring_list.sort( Substring::OccurrenceComparator() );
编辑:您不能使用自由函数std::sort
,因为它需要随机访问迭代器list
迭代器不是。
答案 2 :(得分:3)
上面的Pavel Minaev已经解决了原来的问题 但是还有一些额外的注意事项。
operator()应该是const(以及参数) 对于像这样的简单类,更容易构建它们。
struct OccurrenceComparator
{
bool operator() (Substring const* a, Substring const* b) const;
};
请注意,比较必须提供严格的弱排序:
模板&lt; class BinaryPredicate&gt;
void sort(BinaryPredicate comp);Comp必须是一个比较函数,它引入严格的弱排序(如T类型对象的LessThan Comparable要求中所定义的。此函数根据Comp对列表*进行排序。排序是稳定的,即相对的保留等效元素的顺序。所有迭代器保持有效并继续指向相同的元素。[6]比较的数量约为N log N,其中N是列表的大小。