нет совпадения для вызова, пока std :: sort с лямбда-функцией - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь отсортировать вектор, используя std :: sort, т.е.

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;

};

Я предполагаю, что я объявил лямбда-тип (сигнатуру) другого типа, чем ожидаемый, но, похоже, он соответствует сигнатуре в документах.
Мысли?

1 Ответ

0 голосов
/ 10 февраля 2019

scans - указатель на вектор, содержащий ScanData*.

Следовательно, лямбда может ожидать аргумент, который может связываться с ScanData* const &.

Тип, который вы указываете:const ScanData* & (указанный указатель не const, а pointee).Квалификация не соответствует.Хотя преобразование является возможным из ScanData* в const ScanData*, для этого потребуется временный указатель, а неконстантная ссылка lvalue не может привязываться к одному.

Поскольку указатели являются типами значенийи при этом дешево копировать типы значений, просто не передавайте по ссылке.Передайте указатели по значению в лямбду.

     [](const ScanData *a, const ScanData *b) -> bool
     {
         return (a->version.load() > b->version.load());
     });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...