2011-12-17 15 views
28

Intenté compilar este sencillo programa on IdeOne (que usa gcc 4.5.1) y en mi computadora Linux (que usa algo así como 4.6.4):std :: stoi no existe en g ++ 4.6.1 en MinGW

#include <string> 
#include <iostream> 

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

Y compila perfectamente y saca 32. Sin embargo, cuando intento compilar en mi ordenador ventanas con MinGW y gcc 4.6.1, me sale este error:

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

Lo mismo sucede con std::stoul, etc. ¿El std::stoi y la familia no existir en MinGW para algunos ¿razón? Pensé que gcc en MinGW (sh | w) debería comportarse igual que en Linux.

+0

¿Agregó '-std = C++ 0x'? –

+1

@KerrekSB yes: 'g ++ -std = C++ 0x test.cpp' –

+0

MinGW no lo mantiene el mismo grupo que GCC, por lo que no siempre está actualizado. –

Respuesta

44

Esto es el resultado de una declaración no estándar de vswprintf en Windows. La Biblioteca estándar de GNU define _GLIBCXX_HAVE_BROKEN_VSWPRINTF en esta plataforma, que a su vez desactiva las funciones de conversión que está intentando usar. Puede leer más sobre este tema y macro aquí: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522.

Si usted está dispuesto a modificar los archivos de cabecera distribuidos con MinGW, que puede ser capaz de evitar esto eliminando la macro !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) en la línea 2754 de .../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h, y añadiendo de nuevo alrededor de las líneas 2905-2965 (las líneas que referencia std::vswprintf). No podrá usar las funciones std::to_wstring, pero muchas de las otras funciones de conversión deberían estar disponibles.

+4

Brillante, funcionó a la perfección. Este truco tendrá que ver hasta que lo arreglen apropiadamente. Me parece estúpido que en realidad podrían deshabilitar algunas funciones en la biblioteca estándar en lugar de arreglar realmente algo, pero supongo que tenían sus razones. –

+3

Si puedo hacer esto y las cosas funcionan, ¿por qué no lo hice? simplemente movieron el '# if' unas pocas líneas? –

+6

Este problema también afectó a std :: to_string, y mover la macro debajo de esas líneas me permitió usar esa función. – GravityWell

3

Esto se ha corregido en MinGW-w64, una bifurcación del proyecto MinGW original que realmente está interesada en corregir errores como este. Se corrigió a partir de g ++ 4.9.2, y tal vez antes.


Nota: para las personas que vienen aquí que han hecho una instalación por defecto de CodeBlocks (que viene con la edad, MinGW rota), y se desea actualizar el compilador, see this answer.

Puede usar cualquier compilación de MinGW-w64: utilizo el auto instalador de mingw-builds.org, mientras que esa respuesta usa TDM-GCC-64. Si desea compilación tanto de 64 bits como de 32 bits, necesita instalar y agregar 2 nuevos compiladores: mingw-w64 de 64 bits y mingw-w64 de 32 bits. NO es compatible con el uso de una instalación de g ++ con el interruptor -m32 o -m64 para alternar.

+0

Nota: para las personas que vienen aquí que han hecho una instalación predeterminada de CodeBlocks (que viene con el viejo MinGW roto), y desea actualizar el compilador, [ver esta respuesta] (http://stackoverflow.com/a/27688821/1505939). Puede usar cualquier compilación de MinGW-w64: utilizo el auto instalador de mingw-builds.org, mientras que esa respuesta usa TDM-GCC-64. –

0

Estoy usando MinGW 4.9.3-1. Este problema parece estar todavía ahí. Como solución alternativa, utilicé la otra forma de obtener enteros a partir de cadenas.

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

Use Mingw-w64. Tuve este mismo problema y el uso de Mingw-w64 funcionó para mí.

Cuestiones relacionadas