我遇到编译错误,
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/