fork(1) download
  1. #include <iostream>
  2. #include <string>
  3. #include <unordered_set>
  4. #include <memory>
  5. using namespace std;
  6.  
  7. template<class Entity, class Id>
  8. struct IdFunc {
  9. typedef typename std::function<const Id& (const Entity&)> type;
  10. };
  11.  
  12. template<class Entity, class Id>
  13. struct IdEqualTo {
  14. public:
  15. explicit IdEqualTo(const typename IdFunc<Entity, Id>::type& idFunc) : idFunc_(idFunc) {}
  16. bool operator()(const Entity& lhs, const Entity& rhs) const {
  17. return idFunc_(lhs) == idFunc_(rhs);
  18. }
  19. bool operator()(const Entity* lhs, const Entity* rhs) const {
  20. return idFunc_(*lhs) == idFunc_(*rhs);
  21. }
  22. private:
  23. typename IdFunc<Entity, Id>::type idFunc_;
  24. };
  25.  
  26. template<class Entity, class Id>
  27. struct IdHash {
  28. public:
  29. explicit IdHash(const typename IdFunc<Entity, Id>::type& idFunc) : idFunc_(idFunc) {}
  30. std::size_t operator()(const Entity& o) const {
  31. return std::hash<Id>()(idFunc_(o));
  32. }
  33. std::size_t operator()(const Entity* o) const {
  34. return std::hash<Id>()(idFunc_(*o));
  35. }
  36. private:
  37. typename IdFunc<Entity, Id>::type idFunc_;
  38. };
  39.  
  40. struct MyClass {};
  41.  
  42. int main() {
  43.  
  44. typedef std::unordered_set<std::unique_ptr<MyClass>,
  45. IdHash<MyClass, std::string>, IdEqualTo<MyClass, std::string>> MySet;
  46. MySet set;
  47. return 0;
  48. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
In file included from /usr/include/c++/5/bits/hashtable.h:35:0,
                 from /usr/include/c++/5/unordered_set:47,
                 from prog.cpp:3:
/usr/include/c++/5/bits/hashtable_policy.h: In instantiation of 'struct std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass>, IdHash<MyClass, std::basic_string<char> > >':
/usr/include/c++/5/type_traits:137:12:   required from 'struct std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >'
/usr/include/c++/5/type_traits:148:38:   required from 'struct std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
/usr/include/c++/5/bits/unordered_set.h:95:63:   required from 'class std::unordered_set<std::unique_ptr<MyClass>, IdHash<MyClass, std::basic_string<char> >, IdEqualTo<MyClass, std::basic_string<char> > >'
prog.cpp:46:11:   required from here
/usr/include/c++/5/bits/hashtable_policy.h:85:34: error: no match for call to '(const IdHash<MyClass, std::basic_string<char> >) (const std::unique_ptr<MyClass>&)'
  noexcept(declval<const _Hash&>()(declval<const _Key&>()))>
                                  ^
prog.cpp:30:17: note: candidate: std::size_t IdHash<Entity, Id>::operator()(const Entity&) const [with Entity = MyClass; Id = std::basic_string<char>; std::size_t = unsigned int]
     std::size_t operator()(const Entity& o) const {
                 ^
prog.cpp:30:17: note:   no known conversion for argument 1 from 'const std::unique_ptr<MyClass>' to 'const MyClass&'
prog.cpp:33:17: note: candidate: std::size_t IdHash<Entity, Id>::operator()(const Entity*) const [with Entity = MyClass; Id = std::basic_string<char>; std::size_t = unsigned int]
     std::size_t operator()(const Entity* o) const {
                 ^
prog.cpp:33:17: note:   no known conversion for argument 1 from 'const std::unique_ptr<MyClass>' to 'const MyClass*'
In file included from /usr/include/c++/5/bits/move.h:57:0,
                 from /usr/include/c++/5/bits/stl_pair.h:59,
                 from /usr/include/c++/5/bits/stl_algobase.h:64,
                 from /usr/include/c++/5/bits/char_traits.h:39,
                 from /usr/include/c++/5/ios:40,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from prog.cpp:1:
/usr/include/c++/5/type_traits: In instantiation of 'struct std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >':
/usr/include/c++/5/bits/unordered_set.h:95:63:   required from 'class std::unordered_set<std::unique_ptr<MyClass>, IdHash<MyClass, std::basic_string<char> >, IdEqualTo<MyClass, std::basic_string<char> > >'
prog.cpp:46:11:   required from here
/usr/include/c++/5/type_traits:148:38: error: 'value' is not a member of 'std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >'
     : public integral_constant<bool, !_Pp::value>
                                      ^
In file included from /usr/include/c++/5/unordered_set:48:0,
                 from prog.cpp:3:
/usr/include/c++/5/bits/unordered_set.h: In instantiation of 'class std::unordered_set<std::unique_ptr<MyClass>, IdHash<MyClass, std::basic_string<char> >, IdEqualTo<MyClass, std::basic_string<char> > >':
prog.cpp:46:11:   required from here
/usr/include/c++/5/bits/unordered_set.h:95:63: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef __uset_hashtable<_Value, _Hash, _Pred, _Alloc>  _Hashtable;
                                                               ^
/usr/include/c++/5/bits/unordered_set.h:102:45: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::key_type key_type;
                                             ^
/usr/include/c++/5/bits/unordered_set.h:103:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::value_type value_type;
                                               ^
/usr/include/c++/5/bits/unordered_set.h:104:43: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::hasher hasher;
                                           ^
/usr/include/c++/5/bits/unordered_set.h:105:46: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::key_equal key_equal;
                                              ^
/usr/include/c++/5/bits/unordered_set.h:106:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::allocator_type allocator_type;
                                                   ^
/usr/include/c++/5/bits/unordered_set.h:111:45: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::pointer  pointer;
                                             ^
/usr/include/c++/5/bits/unordered_set.h:112:50: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::const_pointer const_pointer;
                                                  ^
/usr/include/c++/5/bits/unordered_set.h:113:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::reference  reference;
                                               ^
/usr/include/c++/5/bits/unordered_set.h:114:52: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::const_reference const_reference;
                                                    ^
/usr/include/c++/5/bits/unordered_set.h:115:46: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::iterator  iterator;
                                              ^
/usr/include/c++/5/bits/unordered_set.h:116:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::const_iterator const_iterator;
                                                   ^
/usr/include/c++/5/bits/unordered_set.h:117:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::local_iterator local_iterator;
                                                   ^
/usr/include/c++/5/bits/unordered_set.h:118:57: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::const_local_iterator const_local_iterator;
                                                         ^
/usr/include/c++/5/bits/unordered_set.h:119:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::size_type  size_type;
                                               ^
/usr/include/c++/5/bits/unordered_set.h:120:52: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       typedef typename _Hashtable::difference_type difference_type;
                                                    ^
/usr/include/c++/5/bits/unordered_set.h:274:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       operator=(initializer_list<value_type> __l)
       ^
/usr/include/c++/5/bits/unordered_set.h:368:2: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
  emplace(_Args&&... __args)
  ^
/usr/include/c++/5/bits/unordered_set.h:412:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       insert(const value_type& __x)
       ^
/usr/include/c++/5/bits/unordered_set.h:416:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       insert(value_type&& __x)
       ^
/usr/include/c++/5/bits/unordered_set.h:471:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       insert(initializer_list<value_type> __l)
       ^
/usr/include/c++/5/bits/unordered_set.h:616:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       equal_range(const key_type& __x)
       ^
/usr/include/c++/5/bits/unordered_set.h:620:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::__detail::__is_noexcept_hash<std::unique_ptr<MyClass, std::default_delete<MyClass> >, IdHash<MyClass, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >'
       equal_range(const key_type& __x) const
       ^
stdout
Standard output is empty