fork download
  1. #include <unordered_map>
  2. #include <memory>
  3.  
  4. template<typename T>
  5. class TestAllocator
  6. {
  7. public:
  8. typedef T * pointer;
  9. typedef const T * const_pointer;
  10. typedef T & reference;
  11. typedef const T & const_reference;
  12. typedef T value_type;
  13. typedef size_t size_type;
  14. typedef ptrdiff_t difference_type;
  15.  
  16. /*template<typename U>
  17.   struct rebind
  18.   {
  19.   typedef TestAllocator<U> other;
  20.   };*/
  21.  
  22. TestAllocator() { }
  23. template<typename U>
  24. TestAllocator(const TestAllocator<U> &other) { }
  25.  
  26. pointer allocate(int n, pointer hint=0) { return new T[n]; }
  27. pointer deallocate(pointer p, size_t n) { delete[] p; }
  28. pointer address(reference x) { return &x; } // hack! should be std::addressof(x);
  29. void construct(pointer p, const_reference val) { new (p) value_type(val); }
  30. void destroy(pointer p) { p->~value_type(); }
  31. };
  32.  
  33. struct Foo
  34. {
  35. int a, b;
  36. bool operator <(const Foo &r) const
  37. {
  38. return a < r.a;
  39. }
  40. };
  41.  
  42. struct Bar { float a, b; };
  43.  
  44. struct TrivialHash
  45. {
  46. size_t operator()(const Foo &a) const
  47. {
  48. return a.a;
  49. }
  50. };
  51.  
  52. struct TrivialEqual
  53. {
  54. bool operator()(const Foo &a, const Foo &b) const
  55. {
  56. return a.a == b.a;
  57. }
  58. };
  59.  
  60. typedef std::unordered_map<
  61. Foo, Bar,
  62. TrivialHash,
  63. TrivialEqual,
  64. TestAllocator<std::pair<const Foo, Bar>>
  65. > TestContainer;
  66.  
  67. int main()
  68. {
  69. TestContainer x;
  70. x.insert(TestContainer::value_type(Foo(), Bar()));
  71. return 0;
  72. }
  73.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/unordered_map:45:0,
                 from prog.cpp:1:
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h: In instantiation of 'std::_Hashtable<Foo, std::pair<const Foo, Bar>, TestAllocator<std::pair<const Foo, Bar> >, std::_Select1st<std::pair<const Foo, Bar> >, TrivialEqual, TrivialHash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>':
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unordered_map.h:49:5:   instantiated from 'std::__unordered_map<Foo, Bar, TrivialHash, TrivialEqual, TestAllocator<std::pair<const Foo, Bar> >, false>'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unordered_map.h:222:5:   instantiated from 'std::unordered_map<Foo, Bar, TrivialHash, TrivialEqual, TestAllocator<std::pair<const Foo, Bar> > >'
prog.cpp:69:19:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:168:57: error: no class template named 'rebind' in 'class TestAllocator<std::pair<const Foo, Bar> >'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:170:57: error: no class template named 'rebind' in 'class TestAllocator<std::pair<const Foo, Bar> >'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:173:57: error: no class template named 'rebind' in 'class TestAllocator<std::pair<const Foo, Bar> >'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h: In constructor 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hashtable(std::_Hashtable::size_type, const _H1&, const _H2&, const _Hash&, const _Equal&, const _ExtractKey&, const allocator_type&) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable::size_type = unsigned int, allocator_type = TestAllocator<std::pair<const Foo, Bar> >]':
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unordered_map.h:71:66:   instantiated from 'std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::__unordered_map(std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::size_type, std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::hasher&, std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::key_equal&, std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::allocator_type&) [with _Key = Foo, _Tp = Bar, _Hash = TrivialHash, _Pred = TrivialEqual, _Alloc = TestAllocator<std::pair<const Foo, Bar> >, bool __cache_hash_code = false, std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::size_type = unsigned int, std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::hasher = TrivialHash, std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::key_equal = TrivialEqual, std::__unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc, __cache_hash_code>::allocator_type = TestAllocator<std::pair<const Foo, Bar> >]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unordered_map.h:237:36:   instantiated from 'std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::unordered_map(std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type, std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hasher&, std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_equal&, std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::allocator_type&) [with _Key = Foo, _Tp = Bar, _Hash = TrivialHash, _Pred = TrivialEqual, _Alloc = TestAllocator<std::pair<const Foo, Bar> >, std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::size_type = unsigned int, std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::hasher = TrivialHash, std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_equal = TrivialEqual, std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::allocator_type = TestAllocator<std::pair<const Foo, Bar> >]'
prog.cpp:69:19:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:555:24: error: using invalid field 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_node_allocator'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h: In member function 'void std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_deallocate_node(std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node*) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node = std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>]':
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:497:8:   instantiated from 'void std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_deallocate_nodes(std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node**, std::_Hashtable::size_type) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node = std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>, std::_Hashtable::size_type = unsigned int]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:1137:7:   instantiated from 'void std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::clear() [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:689:7:   instantiated from 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::~_Hashtable() [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unordered_map.h:49:5:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:477:7: error: using invalid field 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_node_allocator'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:478:7: error: using invalid field 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_node_allocator'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h: In member function 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node* std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_allocate_node(const value_type&) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Node = std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>, value_type = std::pair<const Foo, Bar>]':
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:903:47:   instantiated from 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::iterator std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_insert_bucket(const value_type&, std::_Hashtable::size_type, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::iterator = std::__detail::_Hashtable_iterator<std::pair<const Foo, Bar>, false, false>, value_type = std::pair<const Foo, Bar>, std::_Hashtable::size_type = unsigned int, typename std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Hash_code_type = unsigned int]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:946:69:   instantiated from 'std::pair<std::__detail::_Hashtable_iterator<_Value, __constant_iterators, __cache_hash_code>, bool> std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_insert(const value_type&, std::true_type) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, value_type = std::pair<const Foo, Bar>, std::true_type = std::integral_constant<bool, true>]'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:404:21:   instantiated from 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Insert_Return_Type std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::insert(const value_type&) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<std::pair<const Foo, Bar> >, _ExtractKey = std::_Select1st<std::pair<const Foo, Bar> >, _Equal = TrivialEqual, _H1 = TrivialHash, _H2 = std::__detail::_Mod_range_hashing, _Hash = std::__detail::_Default_ranged_hash, _RehashPolicy = std::__detail::_Prime_rehash_policy, bool __cache_hash_code = false, bool __constant_iterators = false, bool __unique_keys = true, std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_Insert_Return_Type = std::pair<std::__detail::_Hashtable_iterator<std::pair<const Foo, Bar>, false, false>, bool>, value_type = std::pair<const Foo, Bar>]'
prog.cpp:70:53:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:454:48: error: using invalid field 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_node_allocator'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:457:4: error: using invalid field 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_node_allocator'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:463:4: error: using invalid field 'std::_Hashtable<_Key, _Value, _Allocator, _ExtractKey, _Equal, _H1, _H2, _Hash, _RehashPolicy, __cache_hash_code, __constant_iterators, __unique_keys>::_M_node_allocator'
stdout
Standard output is empty