to_string non è un membro di std, dice g ++ (mingw)


245

Sto preparando un piccolo vocabolario per ricordare un programma in cui le parole verrebbero trasmesse a me in modo casuale per significati. Voglio usare la libreria C ++ standard come ci dice Bjarne Stroustroup, ma ho riscontrato subito un problema apparentemente strano.

Voglio cambiare un longnumero intero in std::stringmodo da poterlo archiviare in un file. Ho impiegato to_string()per lo stesso. Il problema è che quando lo compilo con g ++ (versione 4.7.0 come menzionato nella sua bandiera --‍version), dice:

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'

Il mio programma che dà questo errore è:

#include <string>

int main()
{
    std::to_string(0);
    return 0;
}

Ma so che non può essere perché la libreria msdn dice chiaramente che esiste e una domanda precedente su Stack Overflow (per g ++ versione 4.5) dice che può essere attivata con il -std=c++0xflag. Che cosa sto facendo di sbagliato?


5
Funziona con il mio GCC 4.4.5 (ovvero, genera un errore "sovraccarico ambiguo"); forse il tuo libstdc++è obsoleto?
Fred Foo,

3
Si lavora su Ideone , che utilizza GCC 4.5.1.
Kerrek SB,

5
Questo funziona per me con g ++ 4.6.3. Il tuo errore si riferisce alla riga 11. Dici che il tuo programma è stato "sostanzialmente ridotto a" il tuo codice, ma anche il codice che hai pubblicato dà quell'errore?
Vaughn Cato,

@VaughnCato - Sì, questo è il programma esatto. Dovrei modificarlo per renderlo più chiaro. Inoltre, cosa ci fa quel randagio?
Anurag Kalia,

2
Anche questo non funziona per me, anche se sto usando GCC 5.3.1. Tuttavia, ciò che lo risolve è semplicemente usare uno standard C ++ successivo, ovvero compilando con il flag -std=c++11o superiore.
Arturo don Juan,

Risposte:


212

Questo è un bug noto in MinGW. Bugzilla pertinente . Nella sezione commenti è possibile ottenere una patch per farlo funzionare con MinGW.

Questo problema è stato risolto nelle distro MinGW-w64 superiori a GCC 4.8.0 fornite dal progetto MinGW-w64 . Nonostante il nome, il progetto fornisce toolchain per 32 bit e 64 bit. Anche la distribuzione Nuwen MinGW risolve questo problema.


2
Ulteriori discussioni qui: stackoverflow.com/questions/8542221/…
Ben

11
Sto usando MinGW-w64 versione 4.8.1 e non funziona. Ho copiato il programma esatto dalla domanda. Ottengo ancora "to_string" non è un membro dell'errore "std". L'ho compilato come: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664

5
@ zam664 Non riesco a spiegare perché, ma ho std::to_stringdovuto lavorare installando MinGW 4.8.1 (in particolare, x32-4.8.1-posix-dwarf-rev5) tramite build MinGW . Al contrario, to_stringnon ha funzionato con MinGW 4.8.1 installato tramite il programma di installazione "mingw-get" o il pacchetto TDM-GCC.
Cerran,

5
La patch non è stato abbastanza per me, ho dovuto #define _GLIBCXX_USE_C99 1a C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hcome descritto qui
Zook

3
@Cerran "MinGW-builds" sono build di MinGW-w64, un progetto diverso da MinGW. Uno dei motivi per cui MinGW-w64 è stato biforcuto è stato in modo che potessero effettivamente correggere bug come quello di cui parlava questo thread.
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' ;
}

non dimenticare di includere #include <sstream>


C'è un modo per includere anche lo stod?
Jackie,

Chiamo la tua funzione da qualche altro file sorgente: patch :: to_string (errorCode) (dove errorCode è int) e il compilatore mi dà un errore su quella riga. L'errore è: riferimento indefinito a `std :: string patch :: to_string <int> (int &) 'Comunque ogni volta che includo il tuo codice nello stesso compilatore del file sorgente non mi lamento. Sto cercando di capire cosa c'è che non va.
Nikos,

1
Si noti che questa non è una soluzione esatta per quanto riguarda gli zeri finali. L'originale std::to_string(0.75)verrà di solito restituito "0.750000"(il formato sprintf% d predefinito) mentre verrà restituito "0.75". Vedi qui per motivi: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

47

Come suggerito, questo potrebbe essere un problema con la versione del tuo compilatore.

Prova a utilizzare il seguente codice per convertire un longin std::string:

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

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

Non l'ho eseguito ma grazie per aver risolto il mio dilemma immediato. Ora devo solo capire come funziona. :)
Anurag Kalia,

Solo una nota che se si desidera un std::string, si desidera utilizzare .str()invece.
Christian Mann,

1
Si noti che questa non è una soluzione esatta per quanto riguarda gli zeri finali. L'originale std::to_string(0.75)verrà di solito restituito "0.750000"(il formato sprintf% d predefinito) mentre verrà restituito "0.75". Vedi qui per motivi: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

20

Usa questa funzione ...

    #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

2
Per favore, aggiungi qualche spiegazione (almeno commenti) nelle tue risposte, non importa quanto sia facile da capire il codice.
Vefthym,

4
È bello avere una soluzione alternativa, ma penso che di solito sia meglio capire perché la soluzione
standard

Il modo "standard" (std :: to_string) spesso funziona, tranne quando non lo è. sstream è la soluzione "standard".
Nick Vence,

Si noti che questa non è una soluzione esatta per quanto riguarda gli zeri finali. L'originale std::to_string(0.75)verrà di solito restituito "0.750000"(il formato sprintf% d predefinito) mentre verrà restituito "0.75". Vedi qui per motivi: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

12

to_string è un problema attuale con Cygwin

Ecco una nuova risposta a un vecchio thread. Ne è uscito uno nuovo ma è stato rapidamente eliminato, Cygwin: g ++ 5.2: 'to_string' non è un membro di 'std' .

Peccato, forse avremmo ottenuto una risposta aggiornata. Secondo @Alex, Cygwin g ++ 5.2 non funziona ancora dal 3 novembre 2015.

Il 16 gennaio 2015 Corinna Vinschen, un manutentore Cygwin di Red Hat, ha dichiarato che il problema era una mancanza di newlib. Non supporta le doppie funzioni più lunghe e pertanto non è a conoscenza di C99.

Red Hat è,

... sperando ancora di ottenere la funzionalità "long double" in newlib a un certo punto.

Il 25 ottobre 2015 Corrine ha anche detto :

Sarebbe comunque bello se qualcuno con un po 'di conoscenza della matematica contribuisse con le nuove doppie funzioni mancanti a newlib.

Quindi eccolo qui. Forse uno di noi che ha le conoscenze e il tempo, può contribuire ed essere l'eroe.

Newlib è qui .


Vedendo come sono migrati dall'invio di patch via mail a git solo quest'anno, è scoraggiante ...
r-

8

Modifica lo standard C ++ predefinito

Da (in fase di compilazione FALLITA) Errore: 'to_string' non è un membro di 'std'

-STD = c ++ 98

A (COMPILE FILE SUCCESSFUL)

-std = c ++ 11 o -std = c ++ 14

Testato su Cygwin G ++ (GCC) 5.4.0


3

to_string () è presente solo in c ++ 11, quindi se la versione c ++ è meno usa alcuni metodi alternativi come sprintf o ostringstream


2

Il fatto è che libstdc ++ supporta effettivamente std::to_stringnelle destinazioni * -w64-mingw32 dalla 4.8.0 . Tuttavia, ciò non include il supporto per MinGW.org, Cygwin e varianti (ad esempio * -pc-msys da MSYS2). Vedi anche https://cygwin.com/ml/cygwin/2015-01/msg00245.html .

Ho implementato una soluzione alternativa prima che l'errore risolto per MinGW-w64. Essendo diverso dal codice in altre risposte, questo è un imitazione di libstdc ++ (il più possibile). Non richiede la costruzione di flussi di stringhe ma dipende dalle estensioni libstdc ++. Anche ora sto usando obiettivi mingw-w64 su Windows, funziona ancora bene per più altri obiettivi (purché le long doublefunzioni non vengano utilizzate).


2

Per chiunque si chieda perché questo accada su Android, è probabilmente perché stai usando una libreria standard c ++ sbagliata. Prova a cambiare la libreria c ++ in build.gradle da gnustl_statica c++_statice lo standard c ++ in CMakeLists.txt da -std=gnu++11a-std=c++11


1

Se utilizziamo una soluzione leggera modello (come mostrato sopra) come il seguente:

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

Sfortunatamente, avremo problemi in alcuni casi. Ad esempio, per i membri const statici :

HPP

class A
{
public:

    static const std::size_t x = 10;

    A();
};

cpp

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

E collegamento:

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

Ecco un modo per risolvere il problema (aggiungi al tipo size_t ):

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

HTH.


0

nei blocchi di codice vai su impostazione -> impostazione del compilatore -> flag del compilatore -> seleziona std c ++ 11 fatto. Ho avuto lo stesso problema ... ora funziona!


-4

Questo è successo anche a me, ho appena scritto una funzione rapida piuttosto che preoccuparmi di aggiornare il mio compilatore.

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

29
Questo non è un sostituto di std :: to_string e sicuramente non è una risposta alla domanda.
Verax,

13
Non dimenticare di implementare anche std :: cout! Molto meglio reimplementarsi con molti bug aggiuntivi piuttosto che capire il problema di root!
jmc,

stai rendendo le cose troppo complesse. Soloones_char = '0' + number % 10;
phuclv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.