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

245

Je fais un petit programme de mémorisation de vocabulaire où les mots seraient flashés sur moi au hasard pour les 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 la sortie de la porte.

Je veux changer un longentier std::stringpour 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 ++ (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_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 cela ne peut pas être parce que la bibliothèque msdn dit clairement qu'elle existe et qu'une question précédente sur Stack Overflow (pour g ++ version 4.5) dit qu'elle peut être activée avec le -std=c++0xdrapeau. Qu'est-ce que je fais mal?

Anurag Kalia
la source
5
Fonctionne avec mon GCC 4.4.5 (c'est-à-dire, donne une erreur de "surcharge ambiguë"); peut-être que votre libstdc++est dépassé?
Fred Foo
3
Il fonctionne sur Ideone , qui utilise GCC 4.5.1.
Kerrek SB
5
Cela fonctionne pour moi avec g ++ 4.6.3. Votre erreur se réfère à la ligne 11. Vous dites que votre programme a «essentiellement été réduit à» votre code, mais le code que vous avez publié donne-t-il également cette erreur?
Vaughn Cato
@VaughnCato - Oui, c'est le programme exact. Je devrais le modifier pour le rendre plus clair. De plus, qu'est-ce que je fais là-dedans?
Anurag Kalia
2
Cela ne fonctionne pas non plus pour moi, même si j'utilise GCC 5.3.1. Cependant, ce qui le corrige utilise simplement une norme C ++ ultérieure - c'est-à-dire en compilant avec l'indicateur -std=c++11ou supérieur.
Arturo don Juan

Réponses:

212

Il s'agit d'un bogue 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é corrigé 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 32 bits et 64 bits. La distribution Nuwen MinGW résout également ce problème.

Rapptz
la source
2
Plus de discussion ici: stackoverflow.com/questions/8542221/…
Ben
11
J'utilise MinGW-w64 version 4.8.1 et cela ne fonctionne pas. J'ai copié le programme exact de la question. Je reçois toujours l'erreur "to_string" qui n'est pas membre de "std". Je l'ai compilé comme suit: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664
5
@ zam664 Je ne peux pas expliquer pourquoi, mais je me suis mis std::to_stringau travail en installant MinGW 4.8.1 (en particulier, x32-4.8.1-posix-dwarf-rev5) via les builds MinGW . En revanche, to_stringne fonctionnait pas avec MinGW 4.8.1 installé via le programme d'installation "mingw-get" ou le package TDM-GCC.
Cerran
5
Le patch ne suffisait pas pour moi, je devais #define _GLIBCXX_USE_C99 1en C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hcomme décrit ici
Zook
3
@Cerran "MinGW-builds" sont des versions de MinGW-w64, un projet différent de MinGW. L'une des raisons pour lesquelles MinGW-w64 a été dérivée était qu'ils pouvaient en fait corriger des bogues comme celui sur lequel portait ce fil.
MM
116
#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>

edgarmtze
la source
Existe-t-il un moyen d'inclure également Stod?
Jackie
J'appelle votre fonction à partir d'un autre fichier source: patch :: to_string (errorCode) (où errorCode est int) et le compilateur me donne une erreur sur cette ligne. L'erreur est: une référence non définie à `std :: string patch :: to_string <int> (int &) 'Cependant, chaque fois que j'inclus votre code dans le même compilateur de fichiers source ne se plaint pas. J'essaie de comprendre ce qui ne va pas.
Nikos
1
Veuillez noter que ce n'est pas une solution exacte en ce qui concerne les zéros de fin. L'original std::to_string(0.75)retournera généralement "0.750000"(le format sprintf% d par défaut) tandis que cela reviendra "0.75". Voir ici pour la raison: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
47

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

Essayez d'utiliser le code suivant pour convertir un fichier longen std::string:

#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}
andre
la source
Je ne l'ai pas exécuté mais merci d'avoir résolu mon dilemme immédiat. Il ne me reste plus qu'à comprendre comment cela fonctionne. :)
Anurag Kalia
Juste une note que si vous voulez un std::string, vous devez utiliser à la .str()place.
Christian Mann
1
Veuillez noter que ce n'est pas une solution exacte en ce qui concerne les zéros de fin. L'original std::to_string(0.75)retournera généralement "0.750000"(le format sprintf% d par défaut) tandis que cela reviendra "0.75". Voir ici pour la raison: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
20

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
Nirav Patel
la source
2
Veuillez ajouter quelques explications (commentaires au moins) dans vos réponses, quelle que soit la facilité de compréhension du code.
vefthym
4
C'est bien d'avoir une solution de contournement, mais je pense qu'il est généralement préférable de comprendre pourquoi la solution std ne compile pas plutôt que de pirater quelque chose ensemble
Matt Coubrough
La manière "standard" (std :: to_string) fonctionne souvent - sauf quand ce n'est pas le cas. sstream est la solution de contournement "standard".
Nick Vence
Veuillez noter que ce n'est pas une solution exacte en ce qui concerne les zéros de fin. L'original std::to_string(0.75)retournera généralement "0.750000"(le format sprintf% d par défaut) tandis que cela reviendra "0.75". Voir ici pour la raison: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
12

to_string est un problème actuel avec Cygwin

Voici une nouvelle réponse à un ancien fil de discussion. Un nouveau est apparu mais a été rapidement annulé, Cygwin: g ++ 5.2: 'to_string' n'est pas membre de 'std' .

Dommage, nous aurions peut-être obtenu une réponse mise à jour. Selon @Alex, Cygwin g ++ 5.2 ne fonctionne toujours pas au 3 novembre 2015.

Le 16 janvier 2015, Corinna Vinschen, un responsable Cygwin chez Red Hat, a déclaré que le problème était une lacune de newlib. Il ne prend pas en charge la plupart des fonctions doubles longues et n'est donc pas compatible avec C99.

Red Hat est,

... toujours dans l'espoir d'obtenir la fonctionnalité "long double" dans newlib à un moment donné.

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

Ce serait toujours bien si quelqu'un avec un peu de connaissances en mathématiques contribuait les longues fonctions doubles manquantes à newlib.

Nous y voilà donc. Peut-être que l'un d'entre nous qui a les connaissances et le temps peut contribuer et être le héros.

Newlib est .

Communauté
la source
En voyant comment ils ont migré de l'envoi de correctifs par courrier électronique à git seulement cette année, cela semble décourageant ...
rr-
8

Modifier la norme C ++ par défaut

De (COMPILE FICHIER ECHEC) Erreur: « to_string » est pas un membre de « std »

-std = c ++ 98

À (COMPILE FILE SUCCESSFUL)

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

Testé sur Cygwin G ++ (GCC) 5.4.0

Joma
la source
3

to_string () est seulement présente dans c ++ 11 donc si c ++ version est inférieure utilisent des méthodes alternatives telles que sprintf ou ostringstream

Aishwarya Mittal
la source
2

Le fait est que libstdc ++ est réellement pris std::to_stringen charge dans les cibles * -w64-mingw32 depuis la version 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 également https://cygwin.com/ml/cygwin/2015-01/msg00245.html .

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

FrankHB
la source
2

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++_staticet la norme c ++ dans votre CMakeLists.txt de -std=gnu++11à-std=c++11

kynnysmatto
la source
1

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 les membres const stat :

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 une façon 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.

Boris
la source
0

dans les blocs de code, allez dans setting -> compiler setting -> compiler flag -> select std c ++ 11 done. J'ai eu le même problème ... maintenant ça marche!

5hifaT
la source
-4

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

string to_string(int number){
    string number_string = "";
    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 string.");
        }
        number -= ones;
        number_string = ones_char + number_string;
        if(number == 0){
            break;
        }
        number = number/10;
    }
    return number_string;
}
Jeff Pope
la source
29
Ce n'est pas un substitut de std :: to_string et certainement pas une réponse à la question.
Verax
13
N'oubliez pas d'implémenter std :: cout aussi! Mieux vaut simplement réimplémenter avec beaucoup de bugs supplémentaires que de résoudre le problème racine!
jmc
vous rendez les choses trop complexes. Justeones_char = '0' + number % 10;
phuclv