我尝试编译这个简单的程序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上的行为相同。
答案 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为我工作。