在MinGW上的g ++ 4.6.1中不存在std :: stoi

时间:2011-12-17 02:44:15

标签: c++ gcc mingw

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

#include <string>
#include <iostream>

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

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

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

std::stoul等也是如此。由于某些原因,MinGW中是否存在std::stoi和家庭?我认为MinGW(sh | w)上的gcc与Linux上的行为相同。

4 个答案:

答案 0 :(得分:45)

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

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

答案 1 :(得分:4)

这是在MinGW-w64中修复的,这是原来的MinGW项目的一个分支,实际上有兴趣修复这样的bug。它从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位。它不支持使用一个g ++安装与-m32-m64切换来切换。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用Mingw-w64。我有同样的问题,使用Mingw-w64为我工作。