J'ai essayé de compiler ce programme simple sur IdeOne (qui utilise gcc 4.5.1) et sur mon ordinateur Linux (qui utilise quelque chose comme 4.6.4):
#include <string>
#include <iostream>
int main() {
std::cout << std::stoi("32") << std::endl;
}
Et il compile parfaitement et affiche 32
. Cependant, lorsque j'essaie de le compiler sur mon ordinateur Windows avec MinGW et gcc 4.6.1, le message d'erreur suivant s'affiche:
test.cpp: In function 'int main()':
test.cpp:5:19: error: 'stoi' is not a member of 'std'
La même chose se produit avec std::stoul
, etc. Est-ce que std::stoi
et sa famille n'existent pas dans MinGW pour une raison quelconque? Je pensais que gcc sur MinGW (sh | w) se comporterait de la même façon que sur Linux.
Ceci est le résultat d'une déclaration non standard de vswprintf
sous Windows. La bibliothèque standard GNU définit _GLIBCXX_HAVE_BROKEN_VSWPRINTF
sur cette plate-forme, ce qui désactive les fonctions de conversion que vous tentez d'utiliser. Vous pouvez en savoir plus sur ce problème et la macro ici: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522 .
Si vous souhaitez modifier les fichiers d'en-tête distribués avec MinGW, vous pourrez peut-être contourner ce problème en supprimant la macro !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)
à la ligne 2754 de .../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h
et en l'ajoutant aux lignes 2905 à 2965 (les lignes qui référencent std::vswprintf
). Vous ne pourrez pas utiliser les fonctions std::to_wstring
, mais de nombreuses autres fonctions de conversion devraient être disponibles.
Ceci est corrigé dans MinGW-w64 , un fork du projet original MinGW qui est réellement intéressé par la correction de bugs comme celui-ci. Il a été corrigé à partir de g ++ 4.9.2, et peut-être plus tôt.
Remarque: pour les personnes qui viennent ici et qui ont effectué une installation par défaut de CodeBlocks (fournie avec l’ancien MinGW cassé) et souhaitent mettre à niveau le compilateur, voir cette réponse .
Vous pouvez utiliser n’importe quelle version de MinGW-w64: j’utilise l’auto-installateur de mingw-builds.org, alors que cette réponse utilise TDM-GCC-64. Si vous voulez une compilation 64 bits et 32 bits, vous devez installer et ajouter 2 nouveaux compilateurs: mingw-w64 64 bits et mingw-w64 32 bits. Il ne prend PAS en charge l'utilisation d'une installation de g ++ avec le commutateur -m32
ou -m64
pour basculer.
Utilisez Mingw-W64. J'ai eu le même problème et utiliser Mingw-W64 a fonctionné pour moi.
J'utilise MinGW 4.9.3-1. Ce problème semble être toujours là… .. Pour contourner ce problème, j'ai utilisé un autre moyen d'obtenir des entiers à partir de chaînes.
int rows, columns;
sscanf(argv[1], "%d", &rows);
sscanf(argv[2], "%d", &columns);