【问题标题】:Converting MSVS 2010 project to MSVS 2012 RC but get error "The C++ standard doesn't provide a hash for this type"将 MSVS 2010 项目转换为 MSVS 2012 RC 但出现错误“C++ 标准不提供此类型的哈希”
【发布时间】:2012-06-24 15:37:41
【问题描述】:

我有一个项目在 MSVS 2010 SP1 下运行良好。 我正在尝试将其转换为 MSVS 2012 RC。我不得不更改一些东西,主要与 C++ 头文件/lib 路径和 MFC 自定义内容有关。但我还有最后一个障碍要清除。

在 MSVC 2010 中,我使用了很多 unordered_map<basic_string<TCHAR>, int>map<basic_string<TCHAR>, int>。它编译得很好。但在 MSVS 2012 中,我只收到此错误: “C++ 标准不提供这种类型的哈希”

在网上搜索了一下,发现MSVS 2012应该更接近C++11标准,标准只定义了基本类型的哈希函数和4种定义的字符串类型(其中@987654323 @ 和 wstring,但不包括 basic_string)。 所以我将所有basic_string<TCHAR> 更改为wstring 但无济于事......我仍然遇到同样的错误。

我应该怎么做才能再次编译我的应用程序?

【问题讨论】:

  • 可能在 VS2010 中,您禁用了多字节,因此 TCHAR 映射到 char,现在您启用了多字节字符,因此 TCHAR 映射到 wchar_t。尝试在项目属性中更改这些设置。
  • basic_string<TCHAR>std::stringstd::wstring(两者都只是 typedefs),具体取决于您的项目设置。 C++11 的唯一区别是字符串 hash<> 现在在 <string> 中,而不是 <functional>
  • 感谢 Bo,我必须在任何地方都包含 ,而在此之前我不需要这样做。我必须等待 6 个小时才能给出答案...与此同时,您可以自己动手 :)
  • @OOEngineer:这已经是一个错误,不管hash<>std::basic_string<TCHAR> 需要 <string>
  • MSalters:好吧,我想你可以告诉 VC++ 团队,他们的标准库实现中仍然存在一个大错误......

标签: c++ string map c++11 visual-studio-2012


【解决方案1】:

显然 OOEngineer 使用了 basic_string 而不包括 <string> 标头。无论如何,通过其他标头的间接包含,部分功能可能是可见的。

当 VS2010 发布时,当时提议的标准将所有 std::hash<> 特化放在 <functional> 标头中。在最终的 C++11 标准中,决定最好将它们与各自的容器放在一起,因此将一些 hash<> 特化移至 <string><vector> 等。

因此,要使用std::string 的所有(或任何,实际上)功能,您必须自己包含<string> 标头,而不是依赖另一个系统标头这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多