Ich mache ein kleines Vokabular, in dem ich mich erinnere, in dem mir Wörter zufällig nach Bedeutungen blitzen würden. Ich möchte die Standard-C++ - Bibliothek verwenden, wie Bjarne Stroustroup uns mitteilt, aber ich habe ein scheinbar seltsames Problem direkt vor der Tür entdeckt.
Ich möchte eine long
-Ganzzahl in std::string
ändern, um sie in einer Datei speichern zu können. Ich habe to_string()
für dasselbe eingestellt. Das Problem ist, wenn ich es mit g ++ kompiliere (Version 4.7.0, wie in seinem --version-Flag erwähnt), 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 gibt, lautet:
#include <string>
int main()
{
std::to_string(0);
return 0;
}
Aber ich weiß, dass es nicht sein kann, weil die msdn-Bibliothek eindeutig sagt sie existiert und eine frühere Frage über Stack Overflow (für g ++ Version 4.5) besagt, dass sie mit dem Flag -std=c++0x
aktiviert werden kann. Was mache ich falsch?
Dies ist ein bekannter Fehler unter MinGW. Relevanter Bugzilla . Im Kommentarbereich erhalten Sie ein patch , damit es mit MinGW funktioniert.
Dieses Problem wurde in MinGW-w64-Distros höher als GCC 4.8.0 behoben, die vom MinGW-w64-Projekt bereitgestellt wurden. Trotz des Namens bietet das Projekt Toolchains für 32-Bit und 64-Bit an. Die Nuwen MinGW-Distribution löst dieses Problem ebenfalls.
#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' ;
}
vergessen Sie nicht, #include <sstream>
anzugeben.
Wie vorgeschlagen, kann dies ein Problem mit Ihrer Compilerversion sein.
Verwenden Sie den folgenden Code, um eine long
in std::string
zu konvertieren:
#include <sstream>
#include <string>
#include <iostream>
int main() {
std::ostringstream ss;
long num = 123456;
ss << num;
std::cout << ss.str() << std::endl;
}
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
Hier ist eine neuartige Antwort auf einen alten Thread. Eine neue kam auf, wurde aber schnell aufgehoben, 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 noch immer nicht.
Am 16. Januar 2015 sagte Corinna Vinschen, Cygwin-Betreuerin bei Red Hat das Problem war ein Defizit von newlib. Es unterstützt die meisten langen Doppelfunktionen nicht und ist daher nicht C99-bewusst.
Red Hat ist,
... hofft immer noch, die "long double" -Funktionalität in newlib unter .__ zu erhalten. ein Punkt.
Am 25. Oktober 2015 sagte Corrine auch ,
Es wäre immer noch schön, wenn jemand mit etwas Mathekenntnissen die fehlenden langen Doppelfunktionen zu newlib beitragen.
So haben wir es. Vielleicht kann einer von uns, der das Wissen und die Zeit hat, dazu beitragen und der Held sein.
Newlib ist hier .
Ändern Sie den Standard C++ Standard
From (COMPILE FILE FAILED) Fehler: 'to_string' ist kein Mitglied von 'std'
-std = c ++ 98
To (COMPILE-DATEI ERFOLGREICH)
-std = c ++ 11 oder -std = c ++ 14
Getestet mit Cygwin G ++ (GCC) 5.4.0
Wer sich wundert, warum dies auf Android geschieht, liegt wahrscheinlich daran, dass Sie eine falsche C++ - Standardbibliothek verwenden. Ändern Sie die C++ - Bibliothek in Ihrem build.gradle von gnustl_static
in c++_static
und den C++ - Standard in Ihrer CMakeLists.txt von -std=gnu++11
in -std=c++11
.
Tatsache ist, dass libstdc ++ std::to_string
in * -w64-mingw32-Zielen seit 4.8.0 unterstützt. Dies beinhaltet jedoch keine Unterstützung für MinGW.org, Cygwin und Varianten (z. B. * -pc-msys von MSYS2). Siehe auch https://cygwin.com/ml/cygwin/2015-01/msg00245.html .
Ich habe eine Problemumgehung implementiert, bevor der Fehler für MinGW-w64 behoben wurde. Anders als Code in anderen Antworten, ist dies eine Nachahmung von libstdc ++ (soweit möglich). Es ist keine String-Stream-Konstruktion erforderlich, hängt jedoch von den libstdc ++ - Erweiterungen ab. Selbst jetzt verwende ich mingw-w64-Ziele unter Windows. Es funktioniert trotzdem für mehrere andere Ziele (solange long double
-Funktionen nicht verwendet werden).
Wenn wir eine Template-Light-Lösung (wie oben gezeigt) wie folgt verwenden:
namespace std {
template<typename T>
std::string to_string(const T &n) {
std::ostringstream s;
s << n;
return s.str();
}
}
Leider haben wir in einigen Fällen Probleme. Zum Beispiel für static const 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 (fügen Sie den Typ size_t hinzu):
namespace std {
std::string to_string(size_t n) {
std::ostringstream s;
s << n;
return s.str();
}
}
HTH.
to_string () ist nur in c ++ 11 vorhanden. Wenn die c ++ - Version weniger ist, verwenden Sie einige alternative Methoden wie sprintf oder ostringstream
in Codeblocks gehen Sie zu Einstellung -> Compiler-Einstellung -> Compiler-Flag -> Wählen Sie Std.