To_string is geen lid van SOA, zegt G ++ (MINGW)

Ik maak een klein vocabulaire Remembering-programma waarbij woorden willekeurig naar me zouden worden geflitst voor betekenissen. Ik wil de standaard C++ -bibliotheek gebruiken, omdat Bjarne Stroustroup ons vertelt, maar ik ben een ogenschijnlijk vreemd probleem tegengekomen recht uit de poort.

Ik wil een longinteger in std::stringom het in een bestand te kunnen opslaan. Ik heb to_string()voor hetzelfde in dienst. Het probleem is, wanneer ik het compileer met G ++ (versie 4.7.0 zoals vermeld in de vlag van de –versie), zegt het:

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'

Mijn programma dat deze fout geeft is:

#include <string>
int main()
{
    std::to_string(0);
    return 0;
}

Maar ik weet dat het niet kan zijn omdat MSDN-bibliotheek duidelijk zegt Het bestaat en een eerdere vraag op Stack Overflow (voor G ++ versie 4.5) zegt Dat het kan worden ingeschakeld met de -std=c++0x-vlag. Wat doe ik verkeerd?


Antwoord 1, Autoriteit 100%

Dit is een bekende bug onder MingW. relevante bugzilla . In het gedeelte Reacties kunt u een patch om het met MingW te laten werken.

Dit probleem is opgelost in MinGW-w64-distributies hoger dan GCC 4.8.0 geleverd door de MinGW-w64 project. Ondanks de naam biedt het project toolchains voor 32-bits samen met 64-bits. De Nuwen MinGW distrolost dit probleem ook op.


Antwoord 2, autoriteit 56%

#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' ;
}

vergeet niet om #include <sstream>

. op te nemen


Antwoord 3, autoriteit 22%

Zoals gesuggereerd kan dit een probleem zijn met uw compilerversie.

Probeer de volgende code te gebruiken om een longom te zetten in std::string:

#include <sstream>
#include <string>
#include <iostream>
int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}

Antwoord 4, autoriteit 9%

Gebruik deze functie…

   #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

Antwoord 5, autoriteit 6%

to_string is een actueel probleem met Cygwin

Hier is een nieuw antwoord op een oude thread. Er kwam wel een nieuwe, maar die werd snel vernietigd,
Cygwin: g++ 5.2: ‘to_string’ is geen lid van ‘std’.

Jammer, misschien hadden we een bijgewerkt antwoord gekregen. Volgens @Alex werkt Cygwin g++ 5.2 nog steeds niet op 3 november 2015.

Op 16 januari 2015 zei Corinna Vinschen, een Cygwin-beheerder bij Red Hat het probleemwas een tekortkoming van newlib. Het ondersteunt de meeste lange dubbele functies niet en is daarom niet C99-bewust.

Rode hoed is,

… hoopt nog steeds de “lange dubbele” functionaliteit in newlib at . te krijgen
één punt.

Op 25 oktober 2015 Zei Corrine ook,

Het zou toch leuk zijn als iemand met een beetje wiskundekennis dat zou doen
draag de ontbrekende lange dubbele functies bij aan newlib.

Dus daar hebben we het. Misschien kan een van ons die de kennis en de tijd heeft, een bijdrage leveren en de held zijn.

Newlib is hier.


Antwoord 6, autoriteit 4%

Wijzig standaard C++-standaard

Van(COMPILE FILE FAILED) fout: ‘to_string’ is geen lid van ‘std’

-std=c++98

Aan(COMPILEER BESTAND SUCCESVOL)

-std=c++11 of -std=c++14

Getest op Cygwin G++(GCC) 5.4.0


Antwoord 7

to_string() is alleen aanwezig in c++11, dus als de c++-versie minder is, gebruik dan een aantal alternatieve methoden zoals sprintfof ostringstream


Antwoord 8

Feit is dat libstdc++ feitelijk std::to_stringondersteunde in *-w64-mingw32 doelen sinds 4.8.0. Dit omvat echter geen ondersteuning voor MinGW.org, Cygwin en varianten (bijv. *-pc-msys van MSYS2). Zie ook https://cygwin.com/ml/cygwin/2015-01/msg00245 .html.

Ik heb een tijdelijke oplossingvoordat de bug voor MinGW-w64 werd opgelost. Omdat het anders is dan code in andere antwoorden, is dit een nabootsing van libstdC++ (waar mogelijk). Het vereist geen stringstream-constructie, maar is afhankelijk van libstdc++-extensies. Zelfs nu ik mingw-w64-doelen op Windows gebruik, werkt het nog steeds goed voor meerdere andere doelen (zolang de long double-functies niet worden gebruikt).


Antwoord 9

Als we een template-light-oplossing gebruiken (zoals hierboven weergegeven), zoals de volgende:

namespace std {
    template<typename T>
    std::string to_string(const T &n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

Helaas zullen we in sommige gevallen problemen ondervinden. Bijvoorbeeld voor leden van static const:

hpp

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

cpp

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

En linken:

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

Hier is een manier om het probleem op te lossen (toevoegen aan het type size_t):

namespace std {
    std::string to_string(size_t n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

HTH.


Antwoord 10

Voor iedereen die zich afvraagt waarom dit gebeurt op Android: dit komt waarschijnlijk omdat je een verkeerde c++-standaardbibliotheek gebruikt. Probeer de c++-bibliotheek in uw build.gradle te wijzigen van gnustl_staticin c++_staticen de c++-standaard in uw CMakeLists.txt van -std=gnu++11tot -std=c++11


Antwoord 11

ga in codeblokken naar instelling -> compiler instelling -> compilervlag -> selecteer std c++11 klaar.
Ik had hetzelfde probleem … nu werkt het!


Antwoord 12

Voor mij, ervoor zorgen dat ik het volgende had:

#include <iostream>  
#include<string>  
using namespace std;

in mijn bestand iets als to_string(12345)laten werken.


Antwoord 13

Dit is mij ook overkomen, ik heb zojuist een snelle functie geschreven in plaats van me zorgen te maken over het updaten van mijn compiler.

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

Other episodes