stoi e std :: to_string su mingw 4.7.1

Beh, volevo portare il mio programma C ++ 11 a Windows, ma sembra che in mingw 4.7.1 non ci siano stoi e std :: to_string implementati. So che è stato chiesto e c’era una soluzione per modificare qualche intestazione, ma nella mia versione mingw (4.7.1 fornita con codelite) l’intestazione è diversa e non ci sono le linee esatte che devo spostare (probabilmente perché la risposta era per mingw 4.6).

Quindi la mia domanda è come posso ottenere queste funzioni su mingw 4.7? C’è qualche guida su cosa cambiare nell’header in 4.7 o forse sarà incluso in 4.8?

Ovviamente c’è boost :: lexical_cast, ma mi piacerebbe mantenere il mio codice invariato, quindi sto cercando una soluzione su come abilitare queste funzioni in mingw.

Forse c’è qualche mingw distro personalizzato che viene fornito con il supporto per queste funzioni?

Mingw utilizza l’API di Windows e Windows non fornisce una versione conforms della funzione vswprintf utilizzata per implementare to_string , biasimare Microsoft.

Se si utilizza una (molto) recente versione della fork mingw-w64 e la versione 4.8 inedita di GCC, funzionerà, ma si è fortunati con i principali mingw32 e GCC 4.7.1

Se sei disposto a correggere la tua implementazione, puoi provare la soluzione fornita su http://tehsausage.com/mingw-to-string, ma leggi attentamente le avvertenze.

Aggiornare:

Sembra che solo std::to_wstring sia influenzato dalla funzione vswprintf rotta, quindi ho apportato una modifica a GCC 4.9.3 (e versioni successive) che definirà std::stoi , std::stod , std::to_string ecc. per MinGW e lasciate to_wstring undefined.

Se vuoi modificare l’intestazione 4.7.1, ecco la patch pertinente:

 --- 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  @@ -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