【发布时间】:2019-08-15 00:53:44
【问题描述】:
当它是类数据成员时,我不太确定使用自定义比较器初始化标准集的正确方法是什么。一旦我添加将列表迭代器插入集合的行,以下代码就会导致编译失败。我不知道为什么。
#include <list>
#include <set>
#include <iterator>
auto pred = [](auto const& v1, auto const& v2) {
*v1 < *v2;
};
using LstIter = std::list<int>::iterator;
class MaxStack {
public:
MaxStack()
:valLst(),
valSet(pred)
{}
void push(int x) {
valLst.push_back(x);
LstIter it = std::prev(valLst.end());
// this line causes compile failure
valSet.insert(it);
}
private:
std::list<int> valLst;
std::set<LstIter, decltype(pred)> valSet;
};
现在的问题是我忘记在 lambda 中输入 return。我不敢相信它是这样的,我已经看了 10 分钟的代码,但仍然没有看到它。
但是一个更有趣的问题是,如果那是错误的。为什么编译器在类构造函数代码期间没有出错。当我第一次尝试调用比较器时失败。编译器在构造集合时不应该检查比较器签名吗?
【问题讨论】:
-
显示错误信息的准确和完整的文本。