2013-05-09 1 views
6

부스트 1.53.0을 사용하여 Mac OS X에서 clang (CXX = 'clang ++ -std = C++ 11 -stdlib = libC++')을 사용하고 있습니다.boost :: uuids :: uuid를 std :: unordered_map의 키로 사용 하시겠습니까?

나는 unordered_map도의 키로서 UUID를 사용하기를 원하지만 다음과 같은 오류가 점점 :

/usr/bin/../lib/c++/v1/type_traits:748:38: error: implicit instantiation of undefined template 
     'std::__1::hash<boost::uuids::uuid>' 
    : public integral_constant<bool, __is_empty(_Tp)> {}; 
           ^
/usr/bin/../lib/c++/v1/unordered_map:327:54: note: in instantiation of template class 
     'std::__1::is_empty<std::__1::hash<boost::uuids::uuid> >' requested here 
template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value 

...

/usr/bin/../lib/c++/v1/unordered_map:327:71: error: no member named 'value' in 
     'std::__1::is_empty<std::__1::hash<boost::uuids::uuid> >' 
template <class _Key, class _Tp, class _Hash, bool = is_empty<_Hash>::value 
                ~~~~~~~~~~~~~~~~~^ 

... 그것은 무엇

입니다 - 버그 Boost에서 내 C++ lib와 호환되지 않습니까? 아니면 내가 잘못하고있는거야? 해결 방법은 무엇입니까?

답변

12

부스트가 왜 버그입니까? boost::uuidstd::hash 템플릿을 지정해야합니다.

#include <boost/functional/hash.hpp> 

namespace std 
{ 

template<> 
struct hash<boost::uuids::uuid> 
{ 
    size_t operator() (const boost::uuids::uuid& uid) 
    { 
     return boost::hash<boost::uuids::uuid>()(uid); 
    } 
}; 

} 

또는 단순히 boost::hash

std::unordered_map<boost::uuids::uuid, T, boost::hash<boost::uuids::uuid>> 

으로 unordered_map를 생성하거나 std::hash (근위병 덕분)의 요건을 충족 hash 펑을 제공한다.

+2

+1'std :: hash'의 명시적인 전문화를 제공하는 대신에 타입을 생성하고 ('uuid_hasher'),'uuid_hasher :: operator() (uuid const &)'를 구현할 수 있습니다. 그 타입은'unordered_map'에 대한 세 번째 템플릿 인자가 될 것입니다. – Praetorian

+0

타입에 대한 해시의 전문화의'operator()'가'const'로 표시되어야한다고 생각합니다. const가 아닌 상태로두면 컴파일이 실패합니다. –