误差的std ::目录::排序与自定义比较器(预期前主表达式“)”令牌)(Error in std:

2019-10-16 20:05发布

标题是最主要的问题。 确切的情况(我在“使用命名空间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 ::设置了非常相似的比较,它工作正常。 当我加入sortByOccurrence()funcion它给了我在标题中错误。

我该怎么办?

编辑:我现在试图通过子串:: 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());

我不能删除模板或它给了我一个错误说,模板参数是错误的。

Answer 1:

list成员sort是一个非静态的功能,所以必须在列表实例调用。

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

编辑:不能使用free函数std::sort ,因为它需要随机访问迭代器,其list迭代器都没有。



Answer 2:

你传递一个作为参数传递给函数。 你不能做到这一点 - 你必须创建类的实例,并传递:

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

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

另一个错误是,我们在调用list::sort作为类的静态函数std::list 。 它不是静态的,所以你需要调用它作为一个成员函数substring_list



Answer 3:

原来的问题已经由帕维尔Minaev解决以上。
但一些额外的注意事项。

运营商()可能应该是const(以及参数)。
对于简单的类这样更容易只是让他们的结构。

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

注意比较必须提供一个严格的弱序:

模板<类BinaryPredicate>
空隙排序(BinaryPredicate COMP);

比较必须是一个比较功能,诱导了严格的弱序(如每种不超过可比的需求定义对T类型的对象时,此功能对列表进行排序*这个根据比较,排序是稳定的,也就是相当于相对顺序元件被保留。所有迭代器仍然有效,继续指向相同的元件。[6]比较的数量大约是N日志N,其中N是该列表的大小。



文章来源: Error in std::list::sort with custom comparator (expected primary-expression before ')' token)