1

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

我无法删除模板,或者它给我一个错误,说模板参数错误。

4

3 回答 3

4

您将一个作为参数传递给函数。你不能这样做——你必须创建一个类的实例,并传递它:

substring_list.sort(Substring::OccurrenceComparator());

请注意上面后面的额外括号OccurenceComparator,它们使用默认构造函数创建类的临时对象。

另一个错误是您list::sort在 class 上作为静态函数调用std::list。它不是静态的,因此您需要将其作为substring_list.

于 2009-07-08T21:39:09.977 回答
4

listmembersort是一个非静态函数,因此必须在列表实例上调用。

substring_list.sort( Substring::OccurrenceComparator() );

编辑:您不能使用免费功能std::sort,因为它需要随机访问迭代器,而list迭代器不是。

于 2009-07-08T21:55:32.597 回答
3

上面的 Pavel Minaev 已经解决了最初的问题。
但是一些额外的注释。

operator() 可能应该是 const (以及参数)。
对于像这样的简单类,将它们构建为结构更容易。

struct OccurrenceComparator
{
    bool operator() (Substring const* a, Substring const* b)  const;
};

请注意,比较必须提供严格的弱排序:

模板<class BinaryPredicate>
void sort(BinaryPredicate comp);

Comp 必须是一个导致严格弱排序的比较函数(在对 T 类型对象的 LessThan Comparable 要求中定义。该函数根据 Comp 对列表 *this 进行排序。排序是稳定的,即等价的相对顺序元素被保留。所有迭代器保持有效并继续指向相同的元素。[6] 比较的次数大约为 N log N,其中 N 是列表的大小。

于 2009-07-08T21:44:49.683 回答