Tworzę mały program do zapamiętywania słownictwa, w którym słowa byłyby dla mnie przypadkowo błyskane dla znaczeń. Chcę używać standardowej biblioteki C ++, jak mówi nam Bjarne Stroustroup, ale natknąłem się na pozornie dziwny problem od samego początku.
Chcę zmienić long
liczbę całkowitą na std::string
, aby móc zapisać ją w pliku. Pracowałem to_string()
dla tego samego. Problem polega na tym, że kiedy kompiluję go za pomocą g ++ (wersja 4.7.0, jak wspomniano w jego flagi --version), mówi:
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'
Mój program, który powoduje ten błąd, to:
#include <string>
int main()
{
std::to_string(0);
return 0;
}
Ale wiem, że tak nie może być, ponieważ biblioteka msdn wyraźnie mówi, że istnieje, a wcześniejsze pytanie dotyczące przepełnienia stosu (dla g ++ w wersji 4.5) mówi, że można ją włączyć za pomocą -std=c++0x
flagi. Co ja robię źle?
libstdc++
jest przestarzały?-std=c++11
lub wyższą.Odpowiedzi:
Jest to znany błąd w MinGW. Odpowiednia Bugzilla . W sekcji komentarzy możesz uzyskać łatkę, która będzie działać z MinGW.
Ten problem został rozwiązany w dystrybucjach MinGW-w64 wyższych niż GCC 4.8.0 dostarczonych przez projekt MinGW-w64 . Pomimo nazwy, projekt zapewnia łańcuchy narzędzi dla wersji 32-bitowej wraz z wersją 64-bitową. Nuwen MinGW distro rozwiązuje również ten problem.
źródło
std::to_string
pracować, instalując MinGW 4.8.1 (konkretniex32-4.8.1-posix-dwarf-rev5
) za pomocą kompilacji MinGW . W przeciwieństwie do tego,to_string
zrobił nie praca z MinGW 4.8.1 zainstalowany albo za pośrednictwem „MinGW-get” instalatora lub pakietu TDM-GCC.#define _GLIBCXX_USE_C99 1
wC:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.h
sposób opisany tutajnie zapomnij dołączyć
#include <sstream>
źródło
std::to_string(0.75)
zwykle zwróci"0.750000"
(domyślny format sprintf% d), a ten zwróci"0.75"
. Zobacz przyczynę: stackoverflow.com/a/13686914/785171Zgodnie z sugestią może to być problem z wersją kompilatora.
Spróbuj użyć następującego kodu, aby przekonwertować plik
long
nastd::string
:źródło
std::string
, chcesz użyć.str()
zamiast tego.std::to_string(0.75)
zwykle zwróci"0.750000"
(domyślny format sprintf% d), a ten zwróci"0.75"
. Zobacz przyczynę: stackoverflow.com/a/13686914/785171Użyj tej funkcji ...
źródło
std::to_string(0.75)
zwykle zwróci"0.750000"
(domyślny format sprintf% d), a ten zwróci"0.75"
. Zobacz przyczynę: stackoverflow.com/a/13686914/785171to_string to aktualny problem z Cygwin
Oto nowa odpowiedź na stary wątek. Pojawiło się nowe, ale zostało szybko unieważnione, Cygwin: g ++ 5.2: „to_string” nie jest członkiem „std” .
Szkoda, może otrzymalibyśmy zaktualizowaną odpowiedź. Według @Alex, Cygwin g ++ 5.2 nadal nie działa od 3 listopada 2015.
16 stycznia 2015 r. Corinna Vinschen, opiekunka Cygwin w Red Hat, powiedziała, że problemem jest wada newlib. Nie obsługuje większości długich podwójnych funkcji i dlatego nie obsługuje C99.
Red Hat jest,
W dniu 25 października 2015 Corrine powiedział również ,
Więc mamy to. Być może jeden z nas, który ma wiedzę i czas, może przyczynić się i zostać bohaterem.
Newlib jest tutaj .
źródło
Zmień domyślny standard C ++
Błąd From (COMPILE FILE FAILED): „to_string” nie jest członkiem „std”
Do (SKŁADANIE PLIKU POMYŚLNIE)
Testowane na Cygwin G ++ (GCC) 5.4.0
źródło
to_string () jest obecny tylko w c ++ 11, więc jeśli wersja c ++ jest mniejsza, użyj alternatywnych metod, takich jak sprintf lub ostringstream
źródło
Faktem jest, że libstdc ++ faktycznie jest obsługiwany
std::to_string
w celach * -w64-mingw32 od wersji 4.8.0 . Nie obejmuje to jednak obsługi MinGW.org, Cygwin i wariantów (np. * -Pc-msys z MSYS2). Zobacz także https://cygwin.com/ml/cygwin/2015-01/msg00245.html .Zaimplementowałem obejście, zanim błąd został rozwiązany dla MinGW-w64. W odróżnieniu od kodu w innych odpowiedziach, jest to naśladowanie libstdc ++ (jak to możliwe). Nie wymaga budowy strumienia łańcuchów, ale zależy od rozszerzeń libstdc ++. Nawet teraz używam mingw-w64 w systemie Windows, nadal działa dobrze dla wielu innych celów (o ile
long double
funkcje nie są używane).źródło
Dla każdego, kto zastanawia się, dlaczego tak się dzieje na Androidzie, to prawdopodobnie dlatego, że używasz niewłaściwej standardowej biblioteki c ++. Spróbuj zmienić bibliotekę c ++ w build.gradle z
gnustl_static
nac++_static
i standard c ++ w pliku CMakeLists.txt z-std=gnu++11
na-std=c++11
źródło
Jeśli użyjemy rozwiązania szablon-światło (jak pokazano powyżej), takie jak:
Niestety w niektórych przypadkach będziemy mieć problemy. Na przykład dla stałych stałych statycznych :
hpp
cpp
I łączenie:
Oto jeden ze sposobów rozwiązania problemu (dodaj do typu size_t ):
HTH.
źródło
w blokach kodu przejdź do ustawienia -> ustawienie kompilatora -> flaga kompilatora -> wybierz gotowe st c c ++ 11 gotowe. Miałem ten sam problem ... teraz działa!
źródło
To samo mi się przydarzyło, właśnie napisałem szybką funkcję zamiast martwić się o aktualizację mojego kompilatora.
źródło
ones_char = '0' + number % 10;