I am trying to create an unordered set of pairs
So far I have :
typedef std::pair<int, int> Move;
typedef std::unordered_set<Move> Set;
And I will be creating a set of Moves in the future for now I just have:
Set* King::possibleMoves()
{
Set hello; <-------- THINK ERROR OCCURS HERE
return &hello;
}
But i keep getting these 3 errors:
`/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/type_traits:770:38: error:
implicit instantiation of undefined template 'std::__1::hash<std::__1::pair<int, int>
>'
: public integral_constant<bool, __is_empty(_Tp)> {};
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:1951:40: note:
in instantiation of template class
'std::__1::is_empty<std::__1::hash<std::__1::pair<int, int> > >' requested here
bool = is_empty<_T2>::value
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:1973:44: note:
in instantiation of default argument for '__libcpp_compressed_pair_switch<unsigned
long, std::__1::hash<std::__1::pair<int, int> >, false, false>' required here
template <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value>
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:2357:15: note:
in instantiation of default argument for '__libcpp_compressed_pair_imp<unsigned long,
std::__1::hash<std::__1::pair<int, int> > >' required here
: private __libcpp_compressed_pair_imp<_T1, _T2>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/__hash_table:527:55: note:
in instantiation of template class 'std::__1::__compressed_pair<unsigned long,
std::__1::hash<std::__1::pair<int, int> > >' requested here
__compressed_pair<size_type, hasher> __p2_;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/unordered_set:330:13: note:
in instantiation of template class 'std::__1::__hash_table<std::__1::pair<int, int>,
std::__1::hash<std::__1::pair<int, int> >, std::__1::equal_to<std::__1::pair<int, int>
>, std::__1::allocator<std::__1::pair<int, int> > >' requested here
__table __table_;
^
King.cpp:9:7: note: in instantiation of template class
'std::__1::unordered_set<std::__1::pair<int, int>, std::__1::hash<std::__1::pair<int,
int> >, std::__1::equal_to<std::__1::pair<int, int> >,
std::__1::allocator<std::__1::pair<int, int> > >' requested here
Set hello;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:3081:29: note:
template is declared here
template <class _Tp> struct hash;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:1951:55: error:
no member named 'value' in 'std::__1::is_empty<std::__1::hash<std::__1::pair<int, int>
> >'
bool = is_empty<_T2>::value
~~~~~~~~~~~~~~~^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/memory:1973:44: note:
in instantiation of default argument for '__libcpp_compressed_pair_switch<unsigned
long, std::__1::hash<std::__1::pair<int, int> >, false, false>' required here
template <class _T1, class _T2, unsigned = __libcpp_compressed_pair_switch<_T1, _T2>::value>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The whole error is here (wouldnt let me paste above)
http://fixee.org/paste/528pvoq/
That error message appears when you have failed to specialise std::hash
or provide a hasher type for your unordered container (see e.g. Using C++11 unordered_set in Visual C++ and clang). The XCode error in this case is particularly unfriendly!
C++11 does not provide a hash for pairs (or tuples), even of hashable types. This discussion indicates that this was primarily due to a lack of time to get anything better in; however I'm not aware whether there will be anything better in C++14.
Specialising std::hash<std::pair<int, int>>
is probably not a good idea (and is not permitted by the language; specialising std
templates is only allowed for user-defined types), so you'll have to provide a hasher:
struct MoveHasher {
std::size_t operator()(const std::pair<int, int> &val) const { ... }
};
typedef std::unordered_set<Move, MoveHasher> Set;
See How do I combine hash values in C++0x? for how to write the hash function.
Alternatively, you could make Move
a user-defined class (probably a good idea!) and then specialising std::hash
will be fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With