web-dev-qa-db-fra.com

to_string n'est pas membre de std, dit g ++ (mingw)

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?

224
Anurag Kalia

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.

206
Rapptz
#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>

109
cMinor

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;
}
45
andre

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
20
Nirav Patel

to_string est un problème actuel avec Cygwin

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 .

12
user2603432

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

5
Joma

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

2
kynnysmatto

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).

2
FrankHB

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.

1
Boris

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

1
Aishwarya Mittal

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!

0
ShifaT