c++ - std::sort 与 lambda 函数不匹配调用

标签 c++ lambda

我正在尝试使用 std::sort 对 vector 进行排序,即

ScanIndex::ScanIndex(std::vector<ScanData*> *scans, int currVersion, KeyCell minKey, KeyCell maxKey){
        std::sort(scans->begin(), scans->end(),
         [](const ScanData *& a, const ScanData *& b) -> bool
         {
             return (a->version.load() > b->version.load());
         });
}

出现此错误时:

/usr/include/c++/5/bits/predefined_ops.h: In instantiation of ‘constexpr bool __gnu_cxx::__ops::_Iter_comp_iter<_Compare>::operator()(_Iterator1, _Iterator2) [with _Iterator1 = __gnu_cxx::__normal_iterator<ScanData**, std::vector<ScanData*> >; _Iterator2 = __gnu_cxx::__normal_iterator<ScanData**, std::vector<ScanData*> >; _Compare = ScanIndex::ScanIndex(std::vector<ScanData*>*, int, KeyCell, KeyCell)::<lambda(const ScanData*&, const ScanData*&)>]’:
/usr/include/c++/5/bits/stl_algo.h:1842:14:   required from ‘void std::__insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<ScanData**, std::vector<ScanData*> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<ScanIndex::ScanIndex(std::vector<ScanData*>*, int, KeyCell, KeyCell)::<lambda(const ScanData*&, const ScanData*&)> >]’
/usr/include/c++/5/bits/stl_algo.h:1880:25:   required from ‘void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<ScanData**, std::vector<ScanData*> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<ScanIndex::ScanIndex(std::vector<ScanData*>*, int, KeyCell, KeyCell)::<lambda(const ScanData*&, const ScanData*&)> >]’
/usr/include/c++/5/bits/stl_algo.h:1966:31:   required from ‘void std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<ScanData**, std::vector<ScanData*> >; _Compare = __gnu_cxx::__ops::_Iter_comp_iter<ScanIndex::ScanIndex(std::vector<ScanData*>*, int, KeyCell, KeyCell)::<lambda(const ScanData*&, const ScanData*&)> >]’
/usr/include/c++/5/bits/stl_algo.h:4729:18:   required from ‘void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<ScanData**, std::vector<ScanData*> >; _Compare = ScanIndex::ScanIndex(std::vector<ScanData*>*, int, KeyCell, KeyCell)::<lambda(const ScanData*&, const ScanData*&)>]’
/home/dvir/CLionProjects/KiWi-cpp-pq-port/ScanIndex.cpp:38:11:   required from here
/usr/include/c++/5/bits/predefined_ops.h:125:46: error: no match for call to ‘(ScanIndex::ScanIndex(std::vector<ScanData*>*, int, KeyCell, KeyCell)::<lambda(const ScanData*&, const ScanData*&)>) (ScanData*&, ScanData*&)’
         { return bool(_M_comp(*__it1, *__it2)); }

这是 ScanData 对象

class ScanData{
public:
    static const ScanData* empty_ScanData;

    ScanData(KeyCell min, KeyCell max) : min(min), max(max), version(0)
    {}

    ScanData(const ScanData& scanData) : min(scanData.min), max(scanData.max), version(version.load())
    {}

    std::atomic<int> version;
    KeyCell min;
    KeyCell max;

};

我猜我声明了一种与预期不同的 lambda 类型(签名),但它似乎与文档中的签名相对应。
想法?

最佳答案

scans 是指向包含 ScanData* 的 vector 的指针。

因此,lambda 可以期待一个可以绑定(bind)到 ScanData* const & 的参数。

您指定的类型是const ScanData* &(指代的指针不是const,而是指针对象)。资质不匹配。虽然从 ScanData*const ScanData* 的转换是可能的,但这将需要一个临时指针,并且非常量左值引用不能绑定(bind)一个。

由于指针是值类型,复制值类型的成本很低,所以不要通过引用传递。按值将指针传递给 lambda。

     [](const ScanData *a, const ScanData *b) -> bool
     {
         return (a->version.load() > b->version.load());
     });

关于c++ - std::sort 与 lambda 函数不匹配调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54616370/

相关文章:

list - 根据长度过滤子集?

c# - 如何使用linq根据值获取子对象?

.net core 控制台应用程序中的 c# Main() 函数

c++ - Qt类指针之间的区别

c++ - 在实时视频上检测 SURF 点

c++ - 每次执行时,OpenACC 总和减少输出递增总和

c++ - C++中的初始化二维 vector

c# - 用于查找两个字符串数组之间是否存在任何匹配项的 LINQ 表达式

c++ - 检测一个类型是来自主模板的特化还是用户提供的特化

java - 实现 MapChangeListener 的 onChanged - 为什么这个 lambda