std :: list :: sort中的错误与自定义比较器(''之前的预期primary-expression')令牌)

时间:2009-07-08 21:37:13

标签: c++ stl sorting comparator

标题是主要问题。确切的场景(我'使用命名空间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());

我无法移除模板,或者它给出了一个错误,指出模板参数错误。

3 个答案:

答案 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是列表的大小。