【问题标题】:Sorting a vector by a const member function按 const 成员函数对向量进行排序
【发布时间】:2019-04-08 21:34:37
【问题描述】:

我正在尝试使用 lambda 函数对自定义类的向量进行排序,但在某处我得到了一个我不理解的废弃 const。

我已经尝试在这里寻找答案,虽然很多人都问过几乎完全相同的问题,但似乎没有一个是同一个问题。我不禁止移动构造函数,也不在排序中调用非常量成员/成员函数(至少我知道。显然我做错了什么。)我能想到的最接近的是我做返回非 const 成员的值,但我通过 const 函数执行此操作,并且我明确希望这样做。我想要不能改变任何东西的面向公众的成员函数,以及可以在内部更改的面向私有的成员(但不能通过任何面向公众的函数)。我正在做的唯一真正奇怪的事情(我认为这不会对此产生任何影响)是我的类是不可复制的,并且有一个不可复制的成员(移动很好)。

class MyClass{
 public:
  const SortByThis() { return internal_value; } //Edit: This declaration is the problem, as noted in the accepted answer.
  MyClass(SortByThis, BigNonCopyableDataStrcuture);
  MyClass(MyClass&)=delete; //No copy allowed. Only move.
 private:
  int internal_value;
  BigNonCopyableDataStructure_t big_structure;
}
std::vector<MyClass> vec;
DoFillVec(vec); //Vec now has many items but is not sorted

std::sort(vec.begin(), vec.end(), [](const MyClass &lhs, const MyClass &rhs){return lhs.SortByThis() < rhs.SortByThis();});
//This is where things scream at me.
//Project/Module.cc:226:95: error: passing ‘const Namespace::Module::MyClass’ as ‘this’ argument discards qualifiers [-fpermissive]

我希望这会对向量进行排序,但编译器却抱怨我做错了什么,而且我不明白我到底做错了什么。在这一点上,我只能在它编译之前玩弄东西(这不是一种恶心的感觉)。

【问题讨论】:

  • 我想你的意思是说int SortByThis() const { return internal_value; }。
  • 但在某处我得到了一个我不理解的废弃 const。 const SortByThis(){ return internal_value; } 需要是 int SortByThis() const { return internal_value; }
  • 谢谢你们。我确实声明了一个常量返回类型而不是一个常量函数......哎呀。
  • 你为什么把答案放在问题里?现在看起来你问“这是这个不起作用的代码:。为什么它不起作用?”
  • 好点。我会恢复它,以便它对任何未来的谷歌人更有帮助。

标签: c++


【解决方案1】:

SortByThis 未正确声明。 const 在函数之后,而不是之前:

int SortByThis() const { return internal_value; }

如果这能解决问题,请告诉我们!

【讨论】:

  • 谢谢。我的阅读障碍延伸到我的软件……我花在这上面的时间比我应该做的要长得多。我保证我理解常量返回类型和常量函数之间的区别(我只是一直在搞乱它们的使用)......谢谢。我会尽快接受你的回答(5 分钟计时器)。
  • 很高兴能帮上忙!让我知道是否还有其他问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-14
  • 2012-02-19
  • 1970-01-01
  • 2020-08-12
  • 2019-04-21
相关资源
最近更新 更多