Mingw 使用 Windows API,而 Windows 没有提供用于实现 to_string 的 vswprintf 函数的符合版本,怪罪微软。
如果您使用(非常)最新版本的 mingw-w64 fork 和未发布的 GCC 4.8 版本,那么它可以工作,但您对主要的 mingw32 和 GCC 4.7.1 不太走运
如果您愿意修补您的实施,您可以尝试http://tehsausage.com/mingw-to-string 提供的解决方案,但请仔细阅读注意事项。
更新:
似乎只有std::to_wstring 受到损坏的vswprintf 函数的影响,所以我对GCC 4.9.3(及更高版本)进行了更改,它将定义std::stoi、std::stod、@987654332 @ 等用于 MinGW,而将 to_wstring 保留为未定义。
如果您想自己编辑 4.7.1 标头,这里是相关补丁:
--- a/home/jwakely/gcc/4.7.1/include/c++/4.7.1/bits/basic_string.h
+++ b/home/jwakely/gcc/4.7.1/include/c++/4.7.1/bits/basic_string.h.fix
@@ -2808,8 +2808,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
-#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99) \
- && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
+#if (defined(__GXX_EXPERIMENTAL_CXX0X__) && defined(_GLIBCXX_USE_C99)
#include <ext/string_conversions.h>
@@ -2959,6 +2958,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
stold(const wstring& __str, size_t* __idx = 0)
{ return __gnu_cxx::__stoa(&std::wcstold, "stold", __str.c_str(), __idx); }
+#ifndef _GLIBCXX_HAVE_BROKEN_VSWPRINTF
// DR 1261.
inline wstring
to_wstring(int __val)
@@ -3021,6 +3021,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
L"%Lf", __val);
}
#endif
+#endif
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace