c – 使用std :: reference_wrapper作为std :: map中的键

前端之家收集整理的这篇文章主要介绍了c – 使用std :: reference_wrapper作为std :: map中的键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在类层次结构中有一堆对象,并希望使用对这些对象的引用作为地图中的键来创建std :: map.它看起来像std :: reference_wrapper正是这需要的,但我似乎无法使它工作.到目前为止我尝试了什么:
class Object { // base class of my hierarchy
    // most details unimportant
public
    virtual bool operator< (const Object &) const;  // comparison operator
};

std::map<std::reference_wrapper<const Object>,int> table;

auto it = table.find(object);

table[object] = 42;

table[object]++

但是,我总是从编译器中得到一些模糊的错误

/usr/include/c++/4.5.3/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&,const _Tp&) const [with _Tp = std::reference_wrapper<const Object>]’:
/usr/include/c++/4.5.3/bits/stl_tree.h:1522:38:   instantiated from ‘std::_Rb_tree<_Key,_Val,_KeyOfValue,_Compare,_Alloc>::iterator std::_Rb_tree<_Key,_Alloc>::find(const _Key&) [with _Key = std::reference_wrapper<const Object>,_Val = std::pair<const std::reference_wrapper<const Object>,int>,_KeyOfValue = std::_Select1st<std::pair<const std::reference_wrapper<const Object>,int> >,_Compare = std::less<std::reference_wrapper<const Object> >,_Alloc = std::allocator<std::pair<const std::reference_wrapper<const Object>,std::_Rb_tree<_Key,_Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::reference_wrapper<const Object>,int> >]’
/usr/include/c++/4.5.3/bits/stl_map.h:697:29:   instantiated from ‘std::map<_Key,_Tp,_Alloc>::iterator std::map<_Key,_Alloc>::find(const key_type&)[with _Key = std::reference_wrapper<const Object>,_Tp = int,std::map<_Key,key_type = std::reference_wrapper<const Object>]’
testfile.cpp:39:31:   instantiated from here
/include/c++/4.5.3/bits/stl_function.h:230:22: error: no match for ‘operator<’ in ‘__x < __y’

错误似乎在说它无法比较两个std :: reference_wrapper< const Object>对象,但似乎它应该是可能的 – std :: reference_wrapper有一个转换运算符,可以隐式地将它转换为T& (const Object& here),Object有一个运算符<,那么为什么它不起作用? 它应该工作,这只是g中的一个错误吗?或者还有其他事情发生了吗?

解决方法

如果你将比较运算符设置为自由函数(可能调用虚拟成员函数),它似乎会起作用.

如果它是成员函数,则< b真的意味着a.operator<(b);左侧参数不考虑隐式转换.

猜你在找的C&C++相关文章