c++ - 使用 std::remove_if() 时没有可行的重载 '='

标签 c++ templates compiler-errors

我正在尝试编写一个随时间滑动的滑动窗口,并将最旧的数据作为模板类删除。我使用 std::map 作为容器,使用 std::chrono 来操纵时间。 我在负责删除早于 X 毫秒的数据的方法中遇到编译时错误:

include/c++/5.4.0/bits/stl_pair.h:170:8: error: no viable overloaded '='
    first = std::forward<first_type>(__p.first);

我不明白为什么 std::chrono::steady_clock::time_point 没有可行的“operator =”。 我使用 clang++ 编译器。

模板代码如下:

#include <algorithm>
#include <chrono>
#include <map>
#include <utility>

template <class Data, class Clock, class Time = typename Clock::time_point>

class TimeSlideWindow {
private:
    std::map<Time, Data> mData;

public:    
    void insert(Data value)
    {
        mData.insert(std::make_pair(Clock::now(), value));
    }

    void clearOlderThan(std::chrono::milliseconds ms)
    {
        Time now = Clock::now();
        remove_if(mData.begin(),
                  mData.end(),
                  [ms, now](const std::pair<Time, Data> &elem) {
                      return elem.first < (now - ms);
                  });
    }
};

这里是模板实例化:

TimeSlideWindow<unsigned long, std::chrono::steady_clock> window;
window.clearOlderThan(std::chrono::milliseconds(3));

你能解释一下问题出在哪里吗?谢谢。

最佳答案

remove_if 通过赋值工作,它不适用于映射(或集合),因为它们的键是 const1。 (它实际上也没有从容器中删除元素,因此使用了删除-删除习惯用法。)

LFTS v2 有 erase_if以此目的。链接页面还显示了您可以使用的实现。

此外,由于 map 将其元素按排序顺序排列,您最好先进行搜索(使用 lower_bound),然后进行范围删除。假设 Timemilliseconds 更精确,因此 now - ms 可以转换为 Time:

auto x = mData.lower_bound(now - ms);
mData.erase(mData.begin(), x);

1从技术上讲,它不是集合的 const,但集合只提供对其元素的 const 访问。

关于c++ - 使用 std::remove_if() 时没有可行的重载 '=',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51274751/

相关文章:

c++ - C++如何在二维 vector 初始化中创建不同的 vector ?

c++ - 如何在 Ubuntu 的 C++ 中执行我的程序中的程序?

c++ - 没有为显式模板实例化请求提供合适的定义

c++ - 使用 lambda 和 constexpr-if 初始化静态 bool 会给出地址错误

c++ - 接口(interface)和实现 C++

android-studio - Android Studio : way to make validation markers thicker?

c++ - 混淆 while(cin >> x && x != 0) (当 int x = 0 时)与 while(x != 0 && cin >> x ) (当 int x = 1 时)

c++ - 如果放置在该类模板的定义之后,则类模板的默认模板参数无效

c++ - 静态断言模板类型名 T 不完整?

asp.net-mvc-3 - Razor View 中的CS1003错误