【问题标题】:STL error: use of deleted function when sorting a vector of objects in C++ [closed]STL错误:在C ++中对对象向量进行排序时使用已删除的函数[关闭]
【发布时间】:2018-06-22 20:16:10
【问题描述】:

我有一个带有私有子视图向量的视图类

class MyView {

 private:
   const std::vector<MySubView> subViews_;
}

在子视图中我有这些方法:

class MySubView {
  public:
    const Id getId() const {
        return id_;
    }
    const TimePoint getStartTime() const {
        return startTime_;
    }
  private:
    const Id id_;
    const TimePoint startTime_;

}

现在在 MyView 的构造函数调用的方法之一中,我正在生成这个子视图数组并设置它,它工作正常。当我在分配之前尝试对其进行排序时,问题就来了。

static std::vector<MySubViews> buildLimitViews(
  const ViewData& data);

当我尝试在此方法中构建向量后对其进行排序时。我看到错误。排序是这里唯一不起作用的部分。

std::vector<MySubView> buildLimitViews(
  const ViewData& data) {
    std::vector<MySubView> subViews;
    //create views from data and push them in this vector, works fine.

    // this sort block below does not work, causes errors.
      std::sort(
          subViews.begin(),
          subViews.end(),
          [](const MySubView& lhs,
             const MySubView& rhs) {
            if (lhs.getStartTime() == rhs.getStartTime()) {
              return lhs.getId() < rhs.getId();
            }
            return lhs.getStartTime() < rhs.getStartTime();
          });

    return subViews;
 }

如果我注释掉排序块它工作正常,否则我会看到这个错误:

错误:使用已删除的函数 'MySubView& MySubView::operator=(MySubView&&)'

【问题讨论】:

  • 你必须发布更多关于你的MySubView的信息。发布完整的类定义是个好主意。问题出在MySubView 的定义中,但它出在您尚未显示的内容中。
  • 请将您的问题edit发送至minimal reproducible exampleSSCCE (Short, Self Contained, Correct Example)。我至少需要看到MySubView 的完整声明。
  • @AnT 更新了 MySubView,除了一些私有变量和 const getter 之外,没有太多内容。
  • const MySubView 中的数据成员是问题所在。摆脱数据成员声明中的const 并依赖基于方法的访问控制。

标签: c++ sorting c++11 stl c++14


【解决方案1】:

拥有const 非静态成员变量会破坏赋值,因为您无法修改它们。将subViews_ 设为非const,它应该可以工作。

【讨论】:

  • OP 没有对 subViews_ 进行排序,而是对非 const 函数本地 subViews 进行排序。
  • 啊,真的。我仍然猜测他的 MySubView 类对 const 成员做同样的事情(但此时这只是一个猜测)。
  • 我尝试从 (const MySubView& lhs, const MySubView& rhs) 中删除 const,但得到了同样的错误。
  • 如果您在 MySubView 中有任何 const 非静态成员变量(或者您有引用的成员变量),请删除 const。 const 成员函数或将 const 引用作为参数的函数都可以。
猜你喜欢
  • 2011-10-15
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2011-02-15
  • 2018-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多