【问题标题】:std::stoi doesn't exist in g++ 4.6.1 on MinGWstd::stoi 在 MinGW 上的 g++ 4.6.1 中不存在
【发布时间】:2012-01-22 10:55:35
【问题描述】:

我尝试在我的 Linux 计算机(使用类似 4.6.4 的东西)上编译这个简单的程序 on IdeOne(它使用 gcc 4.5.1):

#include <string>
#include <iostream>

int main() {
     std::cout << std::stoi("32") << std::endl;
}

它完美编译并输出32。但是,当我尝试在我的 Windows 计算机上使用 MinGW 和 gcc 4.6.1 编译它时,我收到了这个错误:

test.cpp: In function 'int main()':
test.cpp:5:19: error: 'stoi' is not a member of 'std'

std::stoul 等也会发生同样的情况。std::stoi 和家人是否由于某种原因在 MinGW 中不存在?我认为 MinGW (sh|w) 上的 gcc 与 Linux 上的行为相同。

【问题讨论】:

  • @KerrekSB 是:g++ -std=c++0x test.cpp
  • MinGW 与 GCC 本身不是由同一组维护的,因此它并不总是最新的。
  • @BenjaminLindley 这是否意味着当您在 MinGW 上执行 g++ -v 并获得某个版本时,它实现的功能没有任何意义?
  • @Seth:嗯,它告诉你编译器的版本。它并没有告诉你太多关于标准库的信息。
  • 我已就此联系过 MinGW-w64 开发人员。对我来说,这只是 libstdc++ 开发者的懒惰。

标签: c++ gcc mingw


【解决方案1】:

这是 Windows 上 vswprintf 的非标准声明的结果。 GNU 标准库在此平台上定义了_GLIBCXX_HAVE_BROKEN_VSWPRINTF,这反过来又禁用了您尝试使用的转换功能。您可以在此处阅读有关此问题和宏的更多信息:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522

如果您愿意修改与 MinGW 一起分发的头文件,您可以通过删除 .../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h 的第 2754 行上的 !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) 宏并将其添加回第 2905 到 2965 行来解决此问题(引用std::vswprintf 的行)。您将无法使用std::to_wstring 函数,但许多其他转换函数应该可用。

【讨论】:

  • 太棒了,完美运行。这个黑客将不得不做,直到他们正确修复它。在我看来,他们实际上会禁用标准库中的某些功能而不是实际修复某些东西,但我想他们有他们的理由。
  • 如果我能做到这一点并且一切正常,他们为什么不把#if 移到几行?
  • 这个问题也影响了 std::to_string,将宏移到这些行下面允许我使用该函数。
  • 只需对报告 gcc 版本 4.8.1 的 MinGW 10.2 执行此操作。
  • @SethCarnegie 问题是有两个项目:g++ 和 mingw - g++ 开发人员添加了警卫,作为对 mingw 开发人员的警告,他们最终需要解决问题。似乎有一些政治问题正在扼杀 mingw 开发人员和 g++ 开发人员之间的沟通。由于这种混乱,截至 2014 年 12 月 01 日仍未有“官方”修复
【解决方案2】:

这是在MinGW-w64 中修复的,它是原始 MinGW 项目的一个分支,实际上对修复此类错误感兴趣。它从 g++ 4.9.2 开始修复,可能更早。


注意:对于已经完成默认安装 CodeBlocks(旧的、损坏的 MinGW 附带)并想要升级编译器的人,see this answer

您可以使用 MinGW-w64 的任何版本:我使用来自 mingw-builds.org 的自安装程序,而该答案使用 TDM-GCC-64。如果您想要 64 位和 32 位编译,则需要安装并添加 2 个新编译器:mingw-w64 64 位和 mingw-w64 32 位。它不支持使用带有-m32-m64 开关的g++ 安装进行切换。

【讨论】:

  • 注意:对于已经完成默认安装 CodeBlocks(旧的、损坏的 MinGW 附带)并想要升级编译器的人,see this answer。您可以使用 MinGW-w64 的任何版本:我使用来自 mingw-builds.org 的自安装程序,而该答案使用 TDM-GCC-64。
【解决方案3】:

我正在使用 MinGW 4.9.3-1。这个问题似乎仍然存在。 作为一种解决方法,我使用了另一种从字符串中获取整数的方法。

int rows, columns;
sscanf(argv[1], "%d", &rows);
sscanf(argv[2], "%d", &columns);

【讨论】:

    【解决方案4】:

    使用 Mingw-w64。我遇到了同样的问题,使用 Mingw-w64 对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-23
      • 2017-08-08
      • 2013-01-22
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      相关资源
      最近更新 更多