web-dev-qa-db-fra.com

std :: stoi n'existe pas dans g ++ 4.6.1 sur MinGW

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.

31
Seth Carnegie

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.

45
DRH

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.

4
M.M

Utilisez Mingw-W64. J'ai eu le même problème et utiliser Mingw-W64 a fonctionné pour moi.

0
Sean Nolan

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);
0
ashish