std :: stoi non esiste in g ++ 4.6.1 su MinGW

Ho provato a compilare questo semplice programma su IdeOne (che usa gcc 4.5.1) e sul mio computer Linux (che usa qualcosa come 4.6.4):

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

E compila perfettamente e produce 32 . Tuttavia, quando provo a compilarlo sul mio computer Windows con MinGW e gcc 4.6.1, ottengo questo errore:

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

Lo stesso accade con std::stoul , ecc. std::stoi e family non esistono in MinGW per qualche motivo? Pensavo che gcc su MinGW (sh | w) si sarebbe comportato come su Linux.

Questo è il risultato di una dichiarazione non standard di vswprintf su Windows. La GNU Standard Library definisce _GLIBCXX_HAVE_BROKEN_VSWPRINTF su questa piattaforma, che a sua volta disabilita le funzioni di conversione che stai tentando di utilizzare. Puoi leggere ulteriori informazioni su questo problema e sulla macro qui: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522 .

Se sei disposto a modificare i file di intestazione distribuiti con MinGW, potresti riuscire a ovviare a questo rimuovendo la macro !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) sulla riga 2754 di .../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h e aggiungendolo nuovamente attorno alle righe da 2905 a 2965 (le linee che fanno riferimento a std::vswprintf ). Non sarai in grado di utilizzare le funzioni std::to_wstring , ma molte delle altre funzioni di conversione dovrebbero essere disponibili.

Questo problema è stato risolto in MinGW-w64 , un fork del progetto originale MinGW che in realtà è interessato a correggere bug come questo. È stato risolto a partire da g ++ 4.9.2 e forse prima.


Nota: per le persone che vengono qui che hanno eseguito un’installazione predefinita di CodeBlocks (che viene fornito con il vecchio minGW danneggiato) e desiderano aggiornare il compilatore, vedere questa risposta .

È ansible utilizzare qualsiasi build di MinGW-w64: utilizzo l’auto-installazione da mingw-builds.org, mentre quella risposta utilizza TDM-GCC-64. Se si desidera compilare sia a 64 bit che a 32 bit, è necessario installare e aggiungere 2 nuovi compilatori: mingw-w64 a 64 bit e mingw-w64 a 32 bit. NON supporta l’utilizzo di un’installazione di g ++ con l’ -m32 o -m64 per passare.

Sto usando MinGW 4.9.3-1. Questo problema sembra essere ancora lì. Come soluzione alternativa, ho usato l’altro modo di ottenere numeri interi da stringhe.

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

Usa Mingw-w64. Ho avuto questo stesso problema e l’utilizzo di Mingw-w64 ha funzionato per me.