Передача boost discrete_interval, так как этот аргумент отбрасывает квалификаторы [-fpermissive]

В следующем коде:

#include <gtest/gtest.h>
#include <algorithm>
#include <vector>
#include <boost/icl/interval_set.hpp>

typedef icl::discrete_interval<unsigned int> Interval;
typedef icl::interval_set<unsigned int> IntervalSet;

int main(int argc, char **argv) {
    // Vector of pairs <epoch, value>
    std::vector<std::pair<unsigned int, double>> simulatedValues = {
        std::make_pair<unsigned int, double>(1000, 44.4),
        std::make_pair<unsigned int, double>(1060, 55.5),
        std::make_pair<unsigned int, double>(1120, 66.6),
        std::make_pair<unsigned int, double>(1180, 77.7),
        std::make_pair<unsigned int, double>(1240, 88.8),
        std::make_pair<unsigned int, double>(1300, 77.7),
        std::make_pair<unsigned int, double>(1360, 66.6),
        std::make_pair<unsigned int, double>(1420, 47.7),
        std::make_pair<unsigned int, double>(1480, 99.9),
        std::make_pair<unsigned int, double>(1540, 33.3)};
    const double testThreshold = 50.0;
    IntervalSet alerts;

    // Create interval set from those epochs where the value is greater than the threshold
    for(auto timeValPair : simulatedValues) {
        unsigned int time = timeValPair.first;
        double value = timeValPair.second;
        if(value > testThreshold) {
            alerts += Interval::closed(time, time);
        }
    }

    // Filter out those discrete intervals with less than 5 minutes of duration
    alerts.erase(
        std::remove_if(alerts.begin(), alerts.end(), [](const auto &x) { return ((x.upper() - x.lower()) < 300); }),
        alerts.end());

    return 0;
}

Я получаю следующую ошибку:

/usr/include/c++/5/bits/stl_algo.h:868:23: error: passing ‘const boost::icl::discrete_interval<unsigned int>’ as ‘this’ argument discards qualifiers [-fpermissive]

Из моего исследования, это обычно потому, что я вызываю неконстантные методы в предикате, но это не так: и верхний, и нижний объявлены как const для в boost discrete_interval.hpp. Итак, что здесь происходит?

1 ответ

Решение

Обратитесь к этому

template< class ForwardIt, class UnaryPredicate >
ForwardIt remove_if( ForwardIt first, ForwardIt last, UnaryPredicate p );

Тип разыменованного ForwardIt должен соответствовать требованиям MoveAssignable.

icl::interval_set<T>::iterator не является MoveAssignable,

Другие вопросы по тегам