Forums

Full Version: Compiling under VS 2012, string hash ?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi. I'm trying to build under Visual Studio 2012.
So far it was ok, but I hit 2 errors, beyond my knowledge how to fix it.

Code:
1>c:\w\vs2012\vc\include\xstddef(238): error C2338: The C++ Standard doesn't provide a hash for this type.
1>          c:\w\vs2012\vc\include\type_traits(743) : see reference to class template instantiation 'std::hash<_Kty>' being compiled
1>          with
1>          [
1>              _Kty=StringId
1>          ]
1>          c:\w\vs2012\vc\include\xhash(224) : see reference to class template instantiation 'std::is_empty<_Ty>' being compiled
1>          with
1>          [
1>              _Ty=std::hash<StringId>
1>          ]
1>          c:\w\vs2012\vc\include\unordered_map(22) : see reference to class template instantiation 'std::_Uhash_compare<_Kty,_Hasher,_Keyeq>' being compiled
1>          with
1>          [
1>              _Kty=StringId,
1>              _Hasher=std::hash<StringId>,
1>              _Keyeq=std::equal_to<StringId>
1>          ]
1>          c:\w\vs2012\vc\include\xhash(261) : see reference to class template instantiation 'std::_Umap_traits<_Kty,_Ty,_Tr,_Alloc,_Mfl>' being compiled
1>          with
1>          [
1>              _Kty=StringId,
1>              _Ty=RenderTextureEntry,
1>              _Tr=std::_Uhash_compare<StringId,std::hash<StringId>,std::equal_to<StringId>>,
1>              _Alloc=std::allocator<std::pair<const StringId,RenderTextureEntry>>,
1>              _Mfl=false
1>          ]
1>          c:\w\vs2012\vc\include\unordered_map(80) : see reference to class template instantiation 'std::_Hash<_Traits>' being compiled
1>          with
1>          [
1>              _Traits=std::_Umap_traits<StringId,RenderTextureEntry,std::_Uhash_compare<StringId,std::hash<StringId>,std::equal_to<StringId>>,std::allocator<std::pair<const StringId,RenderTextureEntry>>,false>
1>          ]
1>          c:\w\_pro\vdr\vdrift\src\graphics\gl3v\renderpass.cpp(141) : see reference to class template instantiation 'std::unordered_map<_Kty,_Ty>' being compiled
1>          with
1>          [
1>              _Kty=StringId,
1>              _Ty=RenderTextureEntry
1>          ]

and the second

Code:
1>c:\w\vs2012\vc\include\xstddef(238): error C2338: The C++ Standard doesn't provide a hash for this type.
1>          c:\w\vs2012\vc\include\type_traits(743) : see reference to class template instantiation 'std::hash<_Kty>' being compiled
1>          with
1>          [
1>              _Kty=StringId
1>          ]
1>          c:\w\vs2012\vc\include\xhash(224) : see reference to class template instantiation 'std::is_empty<_Ty>' being compiled
1>          with
1>          [
1>              _Ty=std::hash<StringId>
1>          ]
1>          c:\w\vs2012\vc\include\unordered_map(22) : see reference to class template instantiation 'std::_Uhash_compare<_Kty,_Hasher,_Keyeq>' being compiled
1>          with
1>          [
1>              _Kty=StringId,
1>              _Hasher=std::hash<StringId>,
1>              _Keyeq=std::equal_to<StringId>
1>          ]
1>          c:\w\vs2012\vc\include\xhash(261) : see reference to class template instantiation 'std::_Umap_traits<_Kty,_Ty,_Tr,_Alloc,_Mfl>' being compiled
1>          with
1>          [
1>              _Kty=StringId,
1>              _Ty=std::vector<GLuint>,
1>              _Tr=std::_Uhash_compare<StringId,std::hash<StringId>,std::equal_to<StringId>>,
1>              _Alloc=std::allocator<std::pair<const StringId,std::vector<GLuint>>>,
1>              _Mfl=false
1>          ]
1>          c:\w\vs2012\vc\include\unordered_map(80) : see reference to class template instantiation 'std::_Hash<_Traits>' being compiled
1>          with
1>          [
1>              _Traits=std::_Umap_traits<StringId,std::vector<GLuint>,std::_Uhash_compare<StringId,std::hash<StringId>,std::equal_to<StringId>>,std::allocator<std::pair<const StringId,std::vector<GLuint>>>,false>
1>          ]
1>          c:\w\_pro\vdr\vdrift\src\graphics\gl3v\renderer.cpp(175) : see reference to class template instantiation 'std::unordered_map<_Kty,_Ty>' being compiled
1>          with
1>          [
1>              _Kty=StringId,
1>              _Ty=std::vector<GLuint>
1>          ]

So it's same thing just in 2 files:
src\graphics\gl3v\renderpass.cpp(141)
src\graphics\gl3v\renderer.cpp(175)

I only found this:
http://stackoverflow.com/questions/15595...rdered-map
Don't know if it helps.
Change std::tr1::unordered_map <StringId, RenderTextureEntry> to std::tr1::unordered_map <StringId, RenderTextureEntry, StringId::hash>
Thanks, works now.
Was in several places, maybe a typedef for iterator would be shorter.
Anyway here is the patch:
http://pastebin.com/Wja07VZk
Yeah, that are some lengthy constructs. I've added a few typedefs to clean it up a bit. Thanks.