2012-05-22 31 views
7

Tôi muốn biết liệu có thể sử dụng tham chiếu đối tượng làm khóa trong vùng chứa unordered_map trong C++ hay không.Sử dụng tham chiếu đối tượng làm khóa trong tiêu chuẩn :: unordered_map

#include <unordered_map> 

class Object { 
    int value; 
}; 

struct object_hash { 
    inline size_t operator()(const Object& o) const { return 0; } 
}; 

std::unordered_map<Object&, int, object_hash> map; 

Khi cố gắng để biên dịch đoạn mã đơn giản này, tôi có một số sai sót về phương pháp định nghĩa lại:

Sử dụng kêu vang với libC++

/usr/include/c++/v1/unordered_map:352:12: error: class member cannot be redeclared

size_t operator()(const _Cp& __x) const

Sử dụng gcc 4.6 với libstdC++

/usr/include/c++/4.6/bits/hashtable_policy.h:556:5: error: ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator [with _Key = Object&, _Pair = std::pair, _Hashtable = std::_Hashtable, std::allocator >, std::_Select1st >, std::equal_to, object_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]’ cannot be overloaded

/usr/include/c++/4.6/bits/hashtable_policy.h:537:5: error: with ‘std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = Object&, _Pair = std::pair, _Hashtable = std::_Hashtable, std::allocator >, std::_Select1st >, std::equal_to, object_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]’

Nếu tôi sử dụng một hash_map cũ gnu thay vào đó (__gnu_cxx :: hash_map), tôi không có vấn đề này .

Đây có phải là hạn chế do áp dụng tiêu chuẩn mới không và nếu có thì tại sao?

Có cách nào để giải quyết hạn chế này không?

Trả lời

10

Tiêu chuẩn mới xác định std:reference_wrapper<T> để giải quyết giới hạn này.

Chuyển đổi hoàn toàn thành T& sao cho nó trong suốt và giống như tham chiếu đảm bảo không có trạng thái null, tuy nhiên không giống như tham chiếu, nó có thể được đặt lại.

Thông tin khác trong Using std::reference_wrapper as key in std::map.

Các vấn đề liên quan