to_string ist kein Mitglied von std, sagt g++ (mingw)
Lesezeit: 7 Minuten
Anurag Kalia
Ich erstelle ein kleines Vokabular-Erinnerungsprogramm, bei dem Wörter zufällig auf ihre Bedeutung hin aufblitzen würden. Ich möchte die Standard-C++-Bibliothek verwenden, wie Bjarne Stroustroup uns sagt, aber ich bin direkt von Anfang an auf ein scheinbar seltsames Problem gestoßen.
Ich möchte a ändern long Ganzzahl in std::string um sie in einer Datei ablegen zu können. Ich habe angestellt to_string() für das Selbe. Das Problem ist, wenn ich es mit g++ (Version 4.7.0, wie in seinem –version-Flag erwähnt) kompiliere, heißt es:
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'
Mein Programm, das diesen Fehler ausgibt, ist:
#include <string>
int main()
{
std::to_string(0);
return 0;
}
Aber ich weiß, dass es nicht an der msdn-Bibliothek liegen kann klar sagt es existiert und eine frühere Frage zu Stack Overflow (für g ++ Version 4.5) besagt, dass es mit aktiviert werden kann -std=c++0x Flagge. Was mache ich falsch?
Funktioniert mit meinem GCC 4.4.5 (dh gibt einen “mehrdeutigen Überlastungsfehler” aus); vielleicht deine libstdc++ ist veraltet?
Dies funktioniert bei mir mit g++ 4.6.3. Ihr Fehler bezieht sich auf Zeile 11. Sie sagen, Ihr Programm wurde “im Wesentlichen auf” Ihren Code reduziert, aber gibt der von Ihnen gepostete Code auch diesen Fehler aus?
– Vaughn Cato
19. Oktober 2012 um 13:40 Uhr
@VaughnCato – Ja, das ist das genaue Programm. Ich sollte es bearbeiten, um es klarer zu machen. Außerdem, was macht dieser Streuner da?
– Anurag Kalia
19. Oktober 2012 um 14:11 Uhr
Dies funktioniert bei mir auch nicht, obwohl ich GCC 5.3.1 verwende. Was es jedoch behebt, ist einfach die Verwendung eines späteren C++-Standards – dh durch Kompilieren mit dem Flag -std=c++11 oder höher.
– Arturo Don Juan
5. September 2016 um 15:47 Uhr
Raptz
Dies ist ein bekannter Fehler unter MinGW. Relevanter Bugzilla. Im Kommentarbereich erhalten Sie eine Patch damit es mit MinGW funktioniert.
Dieses Problem wurde in MinGW-w64-Distributionen höher als GCC 4.8.0 behoben, die von bereitgestellt werden MinGW-w64-Projekt. Trotz des Namens bietet das Projekt Toolchains für 32-Bit zusammen mit 64-Bit. Die Nuwen MinGW-Distribution löst auch dieses Problem.
Weitere Diskussion hier: stackoverflow.com/questions/8542221/…
– Ben
2. November 2012 um 3:09 Uhr
Ich verwende MinGW-w64 Version 4.8.1 und es funktioniert nicht. Ich habe das genaue Programm aus der Frage kopiert. Ich erhalte immer noch den Fehler „to_string“ ist kein Mitglied von „std“. Ich habe es wie folgt kompiliert: g++ -std=c++0x -o tostring_test.exe tostring_test.cpp
– zam664
2. Dezember 2013 um 16:58 Uhr
@zam664 Ich kann nicht erklären warum, aber ich habe std::to_string funktionieren, indem Sie MinGW 4.8.1 installieren (insbesondere x32-4.8.1-posix-dwarf-rev5) durch MinGW-Builds. Im Gegensatz, to_string Tat nicht Arbeiten Sie mit MinGW 4.8.1, das entweder über das Installationsprogramm „mingw-get“ oder das TDM-GCC-Paket installiert wurde.
– Ceran
16. April 2014 um 12:20 Uhr
Der Patch war nicht genug für mich, ich musste #define _GLIBCXX_USE_C99 1 in C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.h wie beschrieben Hier
– Zooch
19. März 2015 um 19:47 Uhr
@Cerran “MinGW-Builds” sind Builds von MinGW-w64, einem anderen Projekt als MinGW. Ein Grund, warum MinGW-w64 abgezweigt wurde, war, dass sie tatsächlich Fehler beheben konnten, wie den, um den es in diesem Thread ging.
vergessen Sie nicht einzuschließen #include <sstream>
Gibt es eine Möglichkeit, auch stod einzubinden?
– Jackie
2. Februar 2016 um 17:34 Uhr
Bitte beachten Sie, dass dies keine exakte Lösung in Bezug auf nachgestellte Nullen ist. Das Original std::to_string(0.75) wird in der Regel zurückkehren "0.750000" (das Standardformat sprintf %d), während dies zurückgegeben wird "0.75". Siehe hier für den Grund: stackoverflow.com/a/13686914/785171
– Krzysztof Bociurko
29. September 2017 um 10:02 Uhr
andre
Wie vorgeschlagen, kann dies ein Problem mit Ihrer Compiler-Version sein.
Versuchen Sie, den folgenden Code zu verwenden, um a long zu std::string:
#include <sstream>
#include <string>
#include <iostream>
int main() {
std::ostringstream ss;
long num = 123456;
ss << num;
std::cout << ss.str() << std::endl;
}
Ich habe es nicht ausgeführt, aber danke, dass Sie mein unmittelbares Dilemma gelöst haben. Jetzt muss ich nur noch herausfinden, wie es funktioniert. 🙂
– Anurag Kalia
19. Oktober 2012 um 14:18 Uhr
Nur eine Anmerkung, wenn Sie möchten std::stringdie Sie verwenden möchten .str() stattdessen.
– Christian Mann
30. November 2014 um 22:34 Uhr
Bitte beachten Sie, dass dies keine exakte Lösung in Bezug auf nachgestellte Nullen ist. Das Original std::to_string(0.75) wird in der Regel zurückkehren "0.750000" (das Standardformat sprintf %d), während dies zurückgegeben wird "0.75". Siehe hier für den Grund: stackoverflow.com/a/13686914/785171
– Krzysztof Bociurko
29. September 2017 um 10:02 Uhr
Nirav Patel
Verwenden Sie diese Funktion …
#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
to_string ist ein aktuelles Problem mit Cygwin
Hier ist eine neue Antwort auf einen alten Thread. Ein neues ist aufgetaucht, wurde aber schnell gelöscht, Cygwin: g++ 5.2: ‘to_string’ ist kein Mitglied von ‘std’.
Schade, vielleicht hätten wir eine aktualisierte Antwort bekommen. Laut @Alex funktioniert Cygwin g++ 5.2 am 3. November 2015 immer noch nicht.
Am 16. Januar 2015 Corinna Vinschen, Cygwin-Maintainer bei Red Hat sagte das Problem war ein Manko von newlib. Es unterstützt die meisten langen Doppelfunktionen nicht und ist daher nicht C99-fähig.
Red Hat ist,
… hoffen immer noch, die “Long Double”-Funktionalität irgendwann in Newlib zu bekommen.
Wenn man sieht, wie sie erst in diesem Jahr vom Versenden von Patches per E-Mail zu Git migriert sind, fühlt es sich entmutigend an …
– rr-
6. Dezember 2015 um 13:59 Uhr
Joma
Standard-C++-Standard ändern
Von (COMPILE FILE FAILED) Fehler: „to_string“ ist kein Mitglied von „std“
-std=c++98
Zu (DATEI KOMPILIEREN ERFOLGREICH)
-std=c++11 oder -std=c++14
Getestet auf Cygwin G++(GCC) 5.4.0
Wenn man sieht, wie sie erst in diesem Jahr vom Versenden von Patches per E-Mail zu Git migriert sind, fühlt es sich entmutigend an …
– rr-
6. Dezember 2015 um 13:59 Uhr
Boris
Wenn wir eine Template-Light-Lösung (wie oben gezeigt) wie die folgende verwenden:
namespace std {
template<typename T>
std::string to_string(const T &n) {
std::ostringstream s;
s << n;
return s.str();
}
}
Leider werden wir in einigen Fällen Probleme haben. Zum Beispiel für statische Konstante Mitglieder:
hpp
class A
{
public:
static const std::size_t x = 10;
A();
};
cpp
A::A()
{
std::cout << std::to_string(x);
}
Und verlinken:
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 ist eine Möglichkeit, das Problem zu lösen (hinzufügen zu type Größe_t):
Funktioniert mit meinem GCC 4.4.5 (dh gibt einen “mehrdeutigen Überlastungsfehler” aus); vielleicht deine
libstdc++
ist veraltet?– Fred Foo
19. Oktober 2012 um 13:33 Uhr
Es funktioniert auf Ideonedas GCC 4.5.1 verwendet.
– Kerrek SB
19. Oktober 2012 um 13:40 Uhr
Dies funktioniert bei mir mit g++ 4.6.3. Ihr Fehler bezieht sich auf Zeile 11. Sie sagen, Ihr Programm wurde “im Wesentlichen auf” Ihren Code reduziert, aber gibt der von Ihnen gepostete Code auch diesen Fehler aus?
– Vaughn Cato
19. Oktober 2012 um 13:40 Uhr
@VaughnCato – Ja, das ist das genaue Programm. Ich sollte es bearbeiten, um es klarer zu machen. Außerdem, was macht dieser Streuner da?
– Anurag Kalia
19. Oktober 2012 um 14:11 Uhr
Dies funktioniert bei mir auch nicht, obwohl ich GCC 5.3.1 verwende. Was es jedoch behebt, ist einfach die Verwendung eines späteren C++-Standards – dh durch Kompilieren mit dem Flag
-std=c++11
oder höher.– Arturo Don Juan
5. September 2016 um 15:47 Uhr