to_ssortingng n’est pas membre de std, dit g ++ (mingw)

Je fais un petit programme de rappel de vocabulaire où les mots me seraient envoyés au hasard pour des significations. Je veux utiliser la bibliothèque C ++ standard comme Bjarne Stroustroup nous le dit, mais j’ai rencontré un problème apparemment étrange dès le départ.

Je veux changer un entier long en std::ssortingng pour pouvoir le stocker dans un fichier. J’ai employé to_ssortingng() pour la même chose. Le problème est que, quand je le comstack avec g ++ (version 4.7.0 comme mentionné dans son drapeau –‍version), il dit:

 PS C:\Users\Anurag\SkyDrive\College\Programs> g++ -std=c++0x ttd.cpp ttd.cpp: In function 'int main()': ttd.cpp:11:2: error: 'to_ssortingng' is not a member of 'std' 

Mon programme qui donne cette erreur est:

 #include  int main() { std::to_ssortingng(0); return 0; } 

Mais, je sais que cela ne peut pas être parce que la bibliothèque msdn dit clairement qu’elle existe et une question précédente sur Stack Overflow (pour g ++ version 4.5) dit qu’elle peut être activée avec l’ -std=c++0x . Qu’est-ce que je fais mal?

Ceci est un bug connu sous MinGW. Bugzilla pertinent . Dans la section des commentaires, vous pouvez obtenir un patch pour le faire fonctionner avec MinGW.

Ce problème a été résolu dans les dissortingbutions MinGW-w64 supérieures à GCC 4.8.0 fournies par le projet MinGW-w64 . Malgré le nom, le projet fournit des chaînes d’outils pour 32 bits avec 64 bits. La dissortingbution Nuwen MinGW résout également ce problème.

 #include  #include  namespace patch { template < typename T > std::ssortingng to_ssortingng( const T& n ) { std::ossortingngstream stm ; stm << n ; return stm.str() ; } } #include  int main() { std::cout << patch::to_string(1234) << '\n' << patch::to_string(1234.56) << '\n' ; } 

N'oubliez pas d'inclure #include

Comme suggéré, cela peut être un problème avec votre version du compilateur.

Essayez d’utiliser le code suivant pour convertir un long en std::ssortingng :

 #include  #include  #include  int main() { std::ossortingngstream ss; long num = 123456; ss << num; std::cout << ss.str() << std::endl; } 

Utilisez cette fonction …

  #include template  std::ssortingng to_ssortingng(T value) { //create an output ssortingng stream std::ossortingngstream os ; //throw the value into the ssortingng stream os << value ; //convert the string stream into a string and return return os.str() ; } //you can also do this //std::string output; //os >> output; //throw whats in the ssortingng stream into the ssortingng 

to_ssortingng est un problème courant avec Cygwin

Voici une nouvelle réponse à un ancien sujet. Cygwin: g ++ 5.2: “to_ssortingng” n’est pas membre de “std” .

Dommage, nous aurions peut-être eu une réponse actualisée. Selon @Alex, Cygwin g ++ 5.2 ne fonctionne toujours pas le 3 novembre 2015.

Le 16 janvier 2015, Corinna Vinschen, une responsable de Cygwin chez Red Hat, a déclaré que le problème était une lacune de newlib. Il ne supporte pas les longues fonctions doubles et n’est donc pas conscient de C99.

Red Hat est,

… espérant toujours avoir la fonctionnalité “double long” dans newlib à un moment donné.

Le 25 octobre 2015, Corrine a également déclaré :

Ce serait quand même sympa si quelqu’un avec un peu de connaissances en mathématiques apportait les fonctions doubles longues manquantes à newlib.

Alors voilà. Peut-être que l’un de nous qui a la connaissance et le temps peut consortingbuer et être le héros.

Newlib est là .

Modifier la norme C ++ par défaut

De l’ erreur (COMPILE FILE FAILED): ‘to_ssortingng’ n’est pas membre de ‘std’

-std = c ++ 98

To (COMPILE FILE SUCCESSFUL)

-std = c ++ 11 ou -std = c ++ 14

Testé sur Cygwin G ++ (GCC) 5.4.0

Le fait est que libstdc ++ supportait réellement std::to_ssortingng dans les cibles * -w64-mingw32 depuis 4.8.0 . Cependant, cela n’inclut pas le support pour MinGW.org, Cygwin et les variantes (par exemple * -pc-msys à partir de MSYS2). Voir aussi https://cygwin.com/ml/cygwin/2015-01/msg00245.html .

J’ai implémenté une solution de contournement avant le bogue résolu pour MinGW-w64. Étant différent du code dans les autres réponses, ceci est une imitation de libstdc ++ (comme possible). Il ne nécessite pas de construction de stream de chaînes mais dépend des extensions libstdc ++. Même maintenant, j’utilise les cibles mingw-w64 sous Windows, cela fonctionne toujours bien pour plusieurs autres cibles (tant que long double fonctions long double ne sont pas utilisées).

Pour ceux qui se demandent pourquoi cela se produit sur Android, c’est probablement parce que vous utilisez une bibliothèque standard c ++ incorrecte. Essayez de changer la bibliothèque c ++ de votre build.gradle de gnustl_static à c++_static et le standard c ++ de votre CMakeLists.txt de -std=gnu++11 à -std=c++11

Si nous utilisons un modèle-light-solution (comme indiqué ci-dessus) comme suit:

 namespace std { template std::ssortingng to_ssortingng(const T &n) { std::ossortingngstream s; s << n; return s.str(); } } 

Malheureusement, nous aurons des problèmes dans certains cas. Par exemple, pour les membres const statiques :

hpp

 class A { public: static const std::size_t x = 10; A(); }; 

cpp

 A::A() { std::cout << std::to_string(x); } 

Et lier:

 CMakeFiles/untitled2.dir/a.cpp.o:a.cpp:(.rdata$.refptr._ZN1A1xE[.refptr._ZN1A1xE]+0x0): undefined reference to `A::x' collect2: error: ld returned 1 exit status 

Voici une façon de résoudre le problème (append le type size_t ):

 namespace std { std::ssortingng to_ssortingng(size_t n) { std::ossortingngstream s; s << n; return s.str(); } } 

HTH.

Cela m’est arrivé aussi, je viens de rédiger une fonction rapide plutôt que de me soucier de mettre à jour mon compilateur.

 ssortingng to_ssortingng(int number){ ssortingng number_ssortingng = ""; char ones_char; int ones = 0; while(true){ ones = number % 10; switch(ones){ case 0: ones_char = '0'; break; case 1: ones_char = '1'; break; case 2: ones_char = '2'; break; case 3: ones_char = '3'; break; case 4: ones_char = '4'; break; case 5: ones_char = '5'; break; case 6: ones_char = '6'; break; case 7: ones_char = '7'; break; case 8: ones_char = '8'; break; case 9: ones_char = '9'; break; default : ErrorHandling("Trouble converting number to ssortingng."); } number -= ones; number_ssortingng = ones_char + number_ssortingng; if(number == 0){ break; } number = number/10; } return number_ssortingng; }