c++ - 'std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique 需要

标签 c++ compiler-errors comparator stdset

我遇到编译错误,

required from 'std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(_Arg&&) [with _Arg = Solution::EnhancedNode* const&; _Key = Solution::EnhancedNode*; _Val = Solution::EnhancedNode*; _KeyOfValue = std::_Identity<Solution::EnhancedNode*>; _Compare = Solution::EnhancedNodeComparator; _Alloc = std::allocator<Solution::EnhancedNode*>]'

不幸的是没有行号,但我删除了代码部分,我相信它与我想应用自定义比较器的 std::set 有关:

class EnhancedNode {
public:
    EnhancedNode(TreeNode* node) {
        node_ = node;
        distance_ = numeric_limits<double>::max();
        discarded_ = false;
    }
    TreeNode* node_;
    double distance_;
    bool discarded_;
};
struct EnhancedNodeComparator {
    bool operator() (const EnhancedNode*& a, const EnhancedNode*& b) const {
        return a->distance_ < b->distance_;
    }
};
set<EnhancedNode*, EnhancedNodeComparator> closest_;
set<EnhancedNode*, EnhancedNodeComparator> next_;

我做错了什么吗?

最佳答案

std::set 的比较器绝对应该接受对集合中的 const 限定类型的引用。

你弄错的是集合中类型的限定。它是 EnhancedNode*,因此用 const 限定它应该给出 EnhancedNode* const。而不是 const EnhancedNode*

这又是一个前导 const 被误导的案例。将您原来的比较器,引用和所有更改为:

struct EnhancedNodeComparator {
    bool operator() (EnhancedNode const * const& a, EnhancedNode const * const& b) const {
        return a->distance_ < b->distance_;
    }
};

您也可以保留 const 限定的指针。 Since C++ explicitly allows it .

删除引用后问题得到解决的原因是 top-level const is ignored按值传递时。因此,您的函数作为参数收到的指针不是 const 限定的并不重要。它只是原件的拷贝。

关于c++ - 'std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique 需要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46463453/

相关文章:

c++ - 相机姿态估计被反转

c++ - memcpy() 未按预期工作

c++ - 从临时流中提取字符时出现 GCC 编译器错误

java - 为 Java TreeSet 创建比较器类

java - 是否可以更改排序中某些符号的优先级(权重)?

c++ - 使用关闭按钮关闭 Opencv 窗口

c# - 使用变量否定 'is' 运算符仅适用于 '!' 但不适用于 '== false'

c - 仅当参数不是常量时,math.h 中的 sqrt 才会导致链接器错误 "undefined reference to sqrt"

java - 双型比较器

c++ - .a .o 和 .lo 文件之间的区别