fork download
  1. #include <unordered_map>
  2. #include <memory>
  3.  
  4. template<typename T>
  5. class TestAllocator;
  6.  
  7. template<>
  8. class TestAllocator<void>
  9. {
  10. public:
  11. typedef void * pointer;
  12. typedef const void * const_pointer;
  13. typedef void value_type;
  14. typedef size_t size_type;
  15. typedef ptrdiff_t difference_type;
  16. //typedef T & reference; not possible for void
  17. //typedef const T & const_reference; not possible for void
  18.  
  19. template<typename U>
  20. struct rebind
  21. {
  22. typedef TestAllocator<U> other;
  23. };
  24. };
  25.  
  26. template<typename T>
  27. class TestAllocator
  28. {
  29. public:
  30. typedef T * pointer;
  31. typedef const T * const_pointer;
  32. typedef T & reference;
  33. typedef const T & const_reference;
  34. typedef T value_type;
  35. typedef size_t size_type;
  36. typedef ptrdiff_t difference_type;
  37.  
  38. template<typename U>
  39. struct rebind
  40. {
  41. typedef TestAllocator<U> other;
  42. };
  43.  
  44. pointer allocate(int n, pointer hint=0) { return new T[n]; }
  45. pointer deallocate(pointer p, size_t n) { delete[] p; }
  46. pointer address(reference x) { return &x; } // hack! should be std::addressof(x);
  47. void construct(pointer p, const_reference val) { new (p) value_type(val); }
  48. void destroy(pointer p) { p->~value_type(); }
  49. };
  50.  
  51. struct Foo
  52. {
  53. int a, b;
  54. bool operator <(const Foo &r) const
  55. {
  56. return a < r.a;
  57. }
  58. };
  59.  
  60. struct Bar { float a, b; };
  61.  
  62. struct TrivialHash
  63. {
  64. size_t operator()(const Foo &a) const
  65. {
  66. return a.a;
  67. }
  68. };
  69.  
  70. struct TrivialEqual
  71. {
  72. bool operator()(const Foo &a, const Foo &b) const
  73. {
  74. return a.a == b.a;
  75. }
  76. };
  77.  
  78. typedef std::unordered_map<
  79. Foo, Bar,
  80. TrivialHash,
  81. TrivialEqual,
  82. TestAllocator<void>
  83. > TestContainer;
  84.  
  85. int main()
  86. {
  87. TestContainer x;
  88. x.insert(TestContainer::value_type(Foo(), Bar()));
  89. return 0;
  90. }
  91.  
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<void>, 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<void>, 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<void> >'
prog.cpp:87:19:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:140:59: error: no type named 'reference' in 'class TestAllocator<void>'
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:141:59: error: no type named 'const_reference' in 'class TestAllocator<void>'
/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_buckets(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<void>, _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:690: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<void>, _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:533:55: error: no matching function for call to 'TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>*>::TestAllocator(std::_Hashtable<Foo, std::pair<const Foo, Bar>, TestAllocator<void>, 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>::_Node_allocator_type&)'
prog.cpp:28:1: note: candidates are: TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>*>::TestAllocator()
prog.cpp:28:1: note:                 TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>*>::TestAllocator(const TestAllocator<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: 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<void>, _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<void>]':
/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<void>, 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<void>]'
/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<void>, 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<void>]'
prog.cpp:87: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: no matching function for call to 'TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false> >::TestAllocator(const std::_Hashtable<Foo, std::pair<const Foo, Bar>, TestAllocator<void>, 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>::allocator_type&)'
prog.cpp:28:1: note: candidates are: TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false> >::TestAllocator()
prog.cpp:28:1: note:                 TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false> >::TestAllocator(const TestAllocator<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: 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_buckets(std::_Hashtable::size_type) [with _Key = Foo, _Value = std::pair<const Foo, Bar>, _Allocator = TestAllocator<void>, _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:558:7:   instantiated from '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<void>, _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<void>]'
/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<void>, 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<void>]'
/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<void>, 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<void>]'
prog.cpp:87:19:   instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/hashtable.h:514:55: error: no matching function for call to 'TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>*>::TestAllocator(std::_Hashtable<Foo, std::pair<const Foo, Bar>, TestAllocator<void>, 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>::_Node_allocator_type&)'
prog.cpp:28:1: note: candidates are: TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>*>::TestAllocator()
prog.cpp:28:1: note:                 TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>*>::TestAllocator(const TestAllocator<std::__detail::_Hash_node<std::pair<const Foo, Bar>, false>*>&)
stdout
Standard output is empty