Tôi có một loạt các đối tượng trong một hệ thống phân cấp lớp và muốn tạo một tham chiếu std::map
cho các đối tượng đó làm các phím trong bản đồ. Nó có vẻ như std::reference_wrapper
sẽ là chính xác những gì là cần thiết cho việc này, nhưng tôi dường như không thể làm cho nó hoạt động. Những gì tôi đã cố gắng cho đến nay:Sử dụng std :: reference_wrapper làm khóa trong std :: map
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]++
Tuy nhiên, tôi luôn nhận được lỗi phần nào che khuất từ trình biên dịch:
/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, _Val, _KeyOfValue, _Compare, _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>, int> >, std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _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, _Compare, _Alloc>::iterator std::map<_Key, _Tp, _Compare, _Alloc>::find(const key_type&)[with _Key = std::reference_wrapper<const Object>, _Tp = int, _Compare = std::less<std::reference_wrapper<const Object> >, _Alloc = std::allocator<std::pair<const std::reference_wrapper<const Object>, int> >, std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::reference_wrapper<const Object>, int> >, 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’
Lỗi này có vẻ được nói rằng nó không thể so sánh hai std::reference_wrapper<const Object>
đối tượng, nhưng có vẻ như có thể - std::reference_wrapper
có một toán tử chuyển đổi có thể chuyển đổi nó thành một số T&
(const Object &
tại đây), và Object
có một số operator <
, vậy tại sao nó không hoạt động?
Nếu nó hoạt động và đây chỉ là lỗi trong g + +? Hoặc là thứ gì đó đang diễn ra?
Không 'std :: ref (đối tượng)
dalle