Je suis en train de créer un petit programme de mémorisation de vocabulaire dans lequel des mots me seraient envoyés au hasard pour des significations. Je souhaite utiliser la bibliothèque C++ standard, comme nous le dit Bjarne Stroustroup, mais j'ai rencontré un problème apparemment étrange dès le départ.
Je veux changer un entier long
en std::string
afin de pouvoir le stocker dans un fichier. J'ai employé to_string()
pour le même. Le problème est que, lorsque je le compile avec g ++ (la version 4.7.0 mentionnée 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_string' is not a member of 'std'
Mon programme qui donne cette erreur est:
#include <string>
int main()
{
std::to_string(0);
return 0;
}
Mais, je sais que ce n'est pas possible car la bibliothèque msdn indique clairement il existe et une question précédente sur Stack Overflow (pour g ++ version 4.5) indique qu'il peut être activé avec l'indicateur -std=c++0x
. Qu'est-ce que je fais mal?
C'est un bug connu sous MinGW. Bugzilla pertinent . Dans la section commentaires, vous pouvez obtenir un patch pour le faire fonctionner avec MinGW.
Ce problème a été résolu dans les distributions MinGW-w64 supérieures à GCC 4.8.0 fournies par le projet MinGW-w64 . Malgré son nom, le projet fournit des chaînes d’outils pour les versions 32 bits et 64 bits. Le Nuwen MinGW distro résout également ce problème.
#include <string>
#include <sstream>
namespace patch
{
template < typename T > std::string to_string( const T& n )
{
std::ostringstream stm ;
stm << n ;
return stm.str() ;
}
}
#include <iostream>
int main()
{
std::cout << patch::to_string(1234) << '\n' << patch::to_string(1234.56) << '\n' ;
}
n'oubliez pas d'inclure #include <sstream>
Comme suggéré, cela peut être un problème avec votre version du compilateur.
Essayez d’utiliser le code suivant pour convertir une long
en std::string
:
#include <sstream>
#include <string>
#include <iostream>
int main() {
std::ostringstream ss;
long num = 123456;
ss << num;
std::cout << ss.str() << std::endl;
}
Utilisez cette fonction ...
#include<sstream>
template <typename T>
std::string to_string(T value)
{
//create an output string stream
std::ostringstream os ;
//throw the value into the string 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 string stream into the string
Voici une réponse nouvelle à un ancien fil de discussion. Un nouveau est arrivé mais a été rapidement annulé, Cygwin: g ++ 5.2: ‘to_string’ n’est pas un membre de ‘std’ .
Dommage, nous aurions peut-être eu une réponse mise à jour. Selon @Alex, Cygwin g ++ 5.2 ne fonctionnait toujours pas au 3 novembre 2015.
Le 16 janvier 2015, Corinna Vinschen, responsable de la maintenance chez Cygwin chez Red Hat a déclaré que le problème était une lacune de newlib. Il ne supporte pas la plupart des doubles fonctions longues et n'est donc pas au courant de C99.
Red Hat est,
... espère toujours intégrer la fonctionnalité "long double" dans newlib à l'adresse un point.
Le 25 octobre 2015 Corrine a également déclaré ,
Ce serait toujours bien si quelqu'un avec un peu de connaissances en mathématiques le ferait apporter les nouvelles longues fonctions manquantes à newlib.
Donc là nous l'avons. Peut-être que l'un de nous qui a la connaissance et le temps peut contribuer et être le héros.
Newlib est ici .
Changer la norme C++ par défaut
De erreur (COMPILE FILE FAILED): 'to_string' 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
Si vous vous demandez pourquoi cela se produit sur Android, c'est probablement parce que vous utilisez une mauvaise bibliothèque standard c ++. Essayez de changer la bibliothèque c ++ dans votre build.gradle de gnustl_static
à c++_static
et la norme c ++ dans votre CMakeLists.txt de -std=gnu++11
à -std=c++11
Le fait est que libstdc ++ a en réalité pris en charge std::to_string
dans * -w64-mingw32 target since 4.8.0 . Cependant, cela n'inclut pas la prise en charge de MinGW.org, Cygwin et des variantes (par exemple * -pc-msys 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. Etant différent du code dans les autres réponses, ceci est un imitateur de libstdc ++ (comme possible). Il ne nécessite pas de construction de flux de chaîne mais dépend des extensions de libstdc ++. Même maintenant, j'utilise des cibles mingw-w64 sous Windows, cela fonctionne toujours pour plusieurs autres cibles (tant que les fonctions long double
ne sont pas utilisées).
Si nous utilisons un template-light-solution (comme indiqué ci-dessus), comme suit:
namespace std {
template<typename T>
std::string to_string(const T &n) {
std::ostringstream s;
s << n;
return s.str();
}
}
Malheureusement, nous aurons des problèmes dans certains cas. Par exemple, pour static const members:
hpp
class A
{
public:
static const std::size_t x = 10;
A();
};
cpp
A::A()
{
std::cout << std::to_string(x);
}
Et reliant:
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 un moyen de résoudre le problème (ajoutez au type size_t ):
namespace std {
std::string to_string(size_t n) {
std::ostringstream s;
s << n;
return s.str();
}
}
HTH.
to_string () n'est présent que dans c ++ 11 donc si la version c ++ est moins utilisée, utilisez d'autres méthodes telles que sprintf ou ostringstream
dans codeblocks, allez dans paramètre -> paramètre de compilateur -> indicateur de compilateur -> sélectionnez std c ++ 11 done ..__ J'ai eu le même problème ... maintenant cela fonctionne!