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

Sto facendo un piccolo vocabolario che ricorda il programma in cui le parole verrebbero mostrate a caso in modo casuale per i significati. Voglio usare la libreria standard del C ++ come ci dice Bjarne Stroustroup, ma ho incontrato un problema apparentemente strano appena uscito dal cancello.

Voglio cambiare un intero long in std::string modo da essere in grado di memorizzarlo in un file. Ho impiegato to_string() per lo stesso. Il problema è che quando lo compilo con g ++ (versione 4.7.0 come menzionato nel suo flag –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  int main() { std::to_string(0); return 0; } 

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

Questo è un bug noto sotto MinGW. Bugzilla pertinente . Nella sezione dei commenti è ansible ottenere una patch per farlo funzionare con MinGW.

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

 #include  #include  namespace patch { template < typename T > std::string to_string( const T& n ) { std::ostringstream stm ; stm < < n ; return stm.str() ; } } #include  int main() { std::cout < < patch::to_string(1234) << '\n' << patch::to_string(1234.56) << '\n' ; } 

non dimenticare di includere #include

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

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

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

Usa questa funzione …

  #include template  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 

to_string è un problema corrente con Cygwin

Ecco una nuova risposta a una vecchia discussione. Ne è uscito uno nuovo, ma è stato rapidamente annullato, 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 a partire dal 3 novembre 2015.

Il 16 gennaio 2015 Corinna Vinschen, una manutentore di Cygwin a Red Hat, ha affermato che il problema era una carenza di newlib. Non supporta la maggior parte delle funzioni doppie 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 matematica contribuisse con le nuove doppie funzioni mancanti a newlib.

Quindi ce l’abbiamo. Forse uno di noi che ha la conoscenza e il tempo può contribuire ed essere l’eroe.

Newlib è qui .

Cambia lo standard C ++ predefinito

Da (FILE COMPILATO NON RIUSCITO) errore: ‘to_string’ non è un membro di ‘std’

-STD = c ++ 98

A (FILE DI SUCCESSO COMPILE)

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

Testato su Cygwin G ++ (GCC) 5.4.0

Il fatto è che libstdc ++ ha effettivamente supportato std::to_string in * -w64-mingw32 target dalla 4.8.0 . Tuttavia, questo 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 il bug fosse risolto per MinGW-w64. Essendo diverso dal codice in altre risposte, questo è un imitatore di libstdc ++ (come ansible). Non richiede la costruzione del stream di stringhe ma dipende dalle estensioni libstdc ++. Anche ora sto usando obiettivi mingw-w64 su Windows, funziona ancora bene per molti altri bersagli (a patto che non vengano usate long double funzioni).

Per chiunque si chieda perché questo accade su Android, è probabilmente perché stai usando una libreria standard c ++ sbagliata. Prova a cambiare la libreria c ++ nel tuo build.gradle da gnustl_static a c++_static e lo standard c ++ nel tuo CMakeLists.txt da -std=gnu++11 a -std=c++11

Se usiamo una soluzione modello-luce (come mostrato sopra) come la seguente:

 namespace std { template 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 il 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.

Questo è successo anche a me, ho appena scritto una rapida funzione 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; }