c++ - portable - std:: stoi no existe en g++ 4.6.1 en MinGW
mingw portable (4)
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, lo que a su vez desactiva las funciones de conversión que está intentando usar. Puedes leer más sobre este tema y macro aquí: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522 .
Si está dispuesto a modificar los archivos de cabecera distribuidos con MinGW, puede !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)
este problema 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 volver a agregarlo a las líneas 2905 a 2965 (las líneas que hacen referencia a std::vswprintf
). No podrá usar las funciones std::to_wstring
, pero muchas de las otras funciones de conversión deberían estar disponibles.
Intenté compilar este sencillo programa en IdeOne (que usa gcc 4.5.1) y en mi computadora Linux (que usa algo como 4.6.4):
#include <string>
#include <iostream>
int main() {
std::cout << std::stoi("32") << std::endl;
}
Y compila perfectamente y produce 32
. Sin embargo, cuando intento compilarlo en mi computadora Windows con MinGW y gcc 4.6.1, aparece este error:
test.cpp: In function ''int main()'':
test.cpp:5:19: error: ''stoi'' is not a member of ''std''
Lo mismo ocurre con std::stoul
, etc. ¿ std::stoi
y familia no existen en MinGW por algún motivo? Pensé que gcc en MinGW (sh | w) debería comportarse igual que en Linux.
Esto se soluciona en MinGW-w64 , una bifurcación del proyecto MinGW original que realmente está interesado 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 predeterminada de CodeBlocks (que viene con el MinGW viejo y roto) y desean actualizar el compilador, consulte esta respuesta .
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 -m32
o -m64
para alternar.
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);
Usa Mingw-w64. Tuve este mismo problema y el uso de Mingw-w64 funcionó para mí.