将MSVS 2010项目转换为MSVS 2012 RC时出现错误“C ++标准未为此类型提供哈希”。

6
我有一个在MSVS 2010 SP1下运行良好的项目。我正在尝试将其转换为MSVS 2012 RC。我不得不改变一些东西,主要是与C ++头/库路径和MFC自定义内容相关的。但我还有最后一个障碍要克服。
在MSVC 2010中,我使用了很多unordered_map<basic_string<TCHAR>, int>map<basic_string<TCHAR>, int>。它可以编译通过。但在MSVS 2012中,我只得到这个错误:“C++标准没有为此类型提供哈希”。
在网上搜索了一下,我发现MSVS 2012应该更接近C++11标准,而标准仅为基本类型和4种定义的字符串类型(其中包括和,但不包括)定义了哈希函数。 所以我把所有的basic_string<TCHAR>都改成了wstring,但还是无济于事……我仍然得到同样的错误。
我应该怎么做才能再次编译我的应用程序?

可能在VS2010中,您已禁用了多字节,因此TCHAR映射到char,现在您启用了多字节字符,因此TCHAR映射到wchar_t。请尝试在项目属性中更改这些设置。 - RedX
1
basic_string<TCHAR> 可以是 std::string 或者 std::wstring(两者都只是 typedef),这取决于你的项目设置。在 C++11 中唯一的区别是,字符串 hash<> 现在在 <string> 而不是 <functional> 中。 - Bo Persson
谢谢Bo,我不得不在每个地方都包含<string>,而以前我不需要这样做。我必须等待6个小时才能回答...在此期间,随意自行操作 :) - OOEngineer
@OOEngineer:这已经是一个错误了,与hash<>无关。你需要使用<string>来处理std::basic_string<TCHAR> - MSalters
MSalters:嗯,我想你可以告诉VC++团队,他们的std lib实现仍然存在一个很大的bug... - OOEngineer
1个回答

8
显然,OOEngineer在不包括头文件的情况下使用了basic_string。部分功能可能仍然可见,通过其他头文件的间接包含。
当VS2010发布时,当时提议的标准将所有std::hash<>特化放在头文件中。在最终的C++11标准中,决定将这些与相应的容器放在一起,因此一些hash<>特化被移动到、等。
因此,为了使用std::string的所有(或任何)功能,您必须自己包括头文件,而不能依赖于另一个系统头文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接