to_string ist kein Mitglied von std, sagt g ++ (mingw)

245

Ich mache ein kleines Vokabular-Erinnerungsprogramm, in dem Wörter nach dem Zufallsprinzip auf mich gerichtet werden, um Bedeutungen zu erhalten. Ich möchte die Standard-C ++ - Bibliothek verwenden, wie uns Bjarne Stroustroup sagt, aber ich bin sofort auf ein scheinbar seltsames Problem gestoßen.

Ich möchte eine longGanzzahl in ändern std::string, um sie in einer Datei speichern zu können. Ich habe to_string()für das gleiche angestellt. Das Problem ist, wenn ich es mit g ++ kompiliere (Version 4.7.0, wie im Flag --‍version 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 ausgibt, ist:

#include <string>

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

Aber ich weiß, es kann nicht an der MSDN-Bibliothek liegen eindeutig dass sie vorhanden ist, und eine frühere Frage zum Stapelüberlauf (für g ++ Version 4.5) besagt, dass sie mit dem -std=c++0xFlag aktiviert werden kann. Was mache ich falsch?

Anurag Kalia
quelle
5
Funktioniert mit meinem GCC 4.4.5 (dh gibt einen "mehrdeutigen Überlastungsfehler" aus); Vielleicht ist deine libstdc++veraltet?
Fred Foo
3
Es funktioniert mit Ideone , das GCC 4.5.1 verwendet.
Kerrek SB
5
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 veröffentlichte Code auch diesen Fehler aus?
Vaughn Cato
@VaughnCato - Ja, das ist das genaue Programm. Ich sollte es bearbeiten, um es klarer zu machen. Plus, was ist das für ein Streuner, den ich dort mache?
Anurag Kalia
2
Dies funktioniert auch bei mir nicht, obwohl ich GCC 5.3.1 verwende. Was jedoch behoben wird, ist die Verwendung eines späteren C ++ - Standards - dh durch Kompilieren mit dem Flag -std=c++11oder höher.
Arturo Don Juan

Antworten:

212

Dies ist ein bekannter Fehler unter MinGW. Relevante Bugzilla . Im Kommentarbereich können Sie einen Patch erhalten , damit er mit MinGW funktioniert.

Dieses Problem wurde in MinGW-w64-Distributionen behoben, die höher als GCC 4.8.0 sind und vom MinGW-w64-Projekt bereitgestellt werden . Trotz des Namens bietet das Projekt Toolchains für 32-Bit und 64-Bit. Die Nuwen MinGW Distribution löst dieses Problem ebenfalls.

Rapptz
quelle
2
Weitere Diskussion hier: stackoverflow.com/questions/8542221/…
Ben
11
Ich verwende MinGW-w64 Version 4.8.1 und es funktioniert nicht. Ich habe das genaue Programm aus der Frage kopiert. Ich bekomme immer noch die 'to_string' ist kein Mitglied von 'std' Fehler. Ich habe es kompiliert als: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664
5
@ zam664 Ich kann nicht erklären warum, aber ich musste std::to_stringarbeiten, indem ich MinGW 4.8.1 (speziell x32-4.8.1-posix-dwarf-rev5) über MinGW-Builds installierte . Im Gegensatz dazu to_stringhat nicht die Arbeit mit MinGW 4.8.1 durch installiert entweder die „mingw-get“ Installateur oder das TDM-GCC - Paket.
Cerran
5
Der Patch für mich nicht genug war, musste ich #define _GLIBCXX_USE_C99 1in C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hwie hier
Zook
3
@Cerran "MinGW-Builds" sind Builds von MinGW-w64, einem anderen Projekt als MinGW. Ein Grund, warum MinGW-w64 abgeschaltet wurde, war, dass sie tatsächlich Fehler beheben konnten, wie sie in diesem Thread behandelt wurden.
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' ;
}

Vergessen Sie nicht einzuschließen #include <sstream>

edgarmtze
quelle
Gibt es eine Möglichkeit, auch Stod einzubeziehen?
Jackie
Ich rufe Ihre Funktion aus einer anderen Quelldatei auf: patch :: to_string (errorCode) (wobei errorCode int ist) und der Compiler gibt mir in dieser Zeile einen Fehler. Der Fehler ist: undefinierter Verweis auf `std :: string patch :: to_string <int> (int &) 'Wenn ich Ihren Code jedoch in denselben Quelldatei-Compiler einbinde, beschwert er sich nicht. Ich versuche herauszufinden, was los ist.
Nikos
1
Bitte beachten Sie, dass dies keine exakte Lösung in Bezug auf nachgestellte Nullen ist. Das Original std::to_string(0.75)wird normalerweise zurückgegeben "0.750000"(das Standardformat sprintf% d), während dies zurückgegeben wird "0.75". Siehe hier für Grund: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
47

Wie vorgeschlagen, kann dies ein Problem mit Ihrer Compilerversion sein.

Versuchen Sie, den folgenden Code zu verwenden, um a longin zu konvertieren std::string:

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

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}
andre
quelle
Ich habe es nicht ausgeführt, aber ich danke Ihnen, dass Sie mein unmittelbares Dilemma gelöst haben. Jetzt muss ich nur noch herausfinden, wie es funktioniert. :)
Anurag Kalia
Nur eine Anmerkung, die Sie stattdessen verwenden std::stringmöchten , wenn Sie eine möchten .str().
Christian Mann
1
Bitte beachten Sie, dass dies keine exakte Lösung in Bezug auf nachgestellte Nullen ist. Das Original std::to_string(0.75)wird normalerweise zurückgegeben "0.750000"(das Standardformat sprintf% d), während dies zurückgegeben wird "0.75". Siehe hier für Grund: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
20

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
Nirav Patel
quelle
2
Bitte fügen Sie Ihren Antworten einige Erklärungen (zumindest Kommentare) hinzu, unabhängig davon, wie einfach der Code zu verstehen ist.
vefthym
4
Es ist gut, eine Problemumgehung zu haben, aber ich denke, es ist normalerweise am besten herauszufinden, warum die Standardlösung nicht kompiliert, sondern etwas zusammen hackt
Matt Coubrough,
Die "Standard" -Methode (std :: to_string) funktioniert oft - außer wenn dies nicht der Fall ist. sstream ist die "Standard" -Umgehung.
Nick Vence
Bitte beachten Sie, dass dies keine exakte Lösung in Bezug auf nachgestellte Nullen ist. Das Original std::to_string(0.75)wird normalerweise zurückgegeben "0.750000"(das Standardformat sprintf% d), während dies zurückgegeben wird "0.75". Siehe hier für Grund: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
12

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 zum 3. November 2015 immer noch nicht.

Am 16. Januar 2015 sagte Corinna Vinschen, eine Cygwin-Betreuerin bei Red Hat , das Problem sei ein Mangel an Newlib. Es unterstützt die meisten langen Doppelfunktionen nicht und ist daher nicht C99-fähig.

Red Hat ist,

... immer noch in der Hoffnung, die "Long Double" -Funktionalität irgendwann in newlib zu integrieren.

Am 25. Oktober 2015 Corrine sagte auch ,

Es wäre immer noch schön, wenn jemand mit ein bisschen Mathematikwissen die fehlenden langen Doppelfunktionen zu newlib beitragen würde.

Da haben wir es also. Vielleicht kann einer von uns, der das Wissen und die Zeit hat, dazu beitragen und der Held sein.

Newlib ist da .

Gemeinschaft
quelle
Angesichts der
Tatsache
8

Ändern Sie den Standard-C ++ - Standard

Von (COMPILE FILE FAILED) Fehler: 'to_string' ist kein Mitglied von 'std'

-std = c ++ 98

Zu (DATEI ERFOLGREICH ERSTELLEN)

-std = c ++ 11 oder -std = c ++ 14

Getestet auf Cygwin G ++ (GCC) 5.4.0

Joma
quelle
3

to_string () ist nur in c ++ 11 vorhanden. Wenn die c ++ - Version weniger ist, verwenden Sie einige alternative Methoden wie sprintf oder ostringstream

Aishwarya Mittal
quelle
2

Tatsache ist, dass libstdc ++ seit 4.8.0 tatsächlich std::to_stringin * -w64-mingw32-Zielen unterstützt wird . 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. Da dies sich von Code in anderen Antworten unterscheidet, ist dies eine Nachahmung von libstdc ++ (wie möglich). Es erfordert keine String-Stream-Konstruktion, hängt jedoch von libstdc ++ - Erweiterungen ab. Selbst jetzt, wo ich mingw-w64-Ziele unter Windows verwende, funktioniert es immer noch gut für mehrere andere Ziele (solange long doubleFunktionen nicht verwendet werden).

FrankHB
quelle
2

Wenn Sie sich fragen, warum dies unter Android geschieht, liegt dies wahrscheinlich daran, dass Sie eine falsche C ++ - Standardbibliothek verwenden. Versuchen Sie, die c ++ - Bibliothek in Ihrem build.gradle von gnustl_staticbis c++_staticund den c ++ - Standard in Ihrer CMakeLists.txt von -std=gnu++11bis zu ändern-std=c++11

kynnysmatto
quelle
1

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 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 (zum Typ size_t hinzufügen ):

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

HTH.

Boris
quelle
0

In Codeblöcken gehen Sie zu Einstellung -> Compiler-Einstellung -> Compiler-Flag -> wählen Sie Standard-C ++ 11 fertig. Ich hatte das gleiche Problem ... jetzt funktioniert es!

5hifaT
quelle
-4

Dies ist mir auch passiert. Ich habe nur eine Schnellfunktion geschrieben, anstatt mir Gedanken über die Aktualisierung meines Compilers zu machen.

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;
}
Jeff Pope
quelle
29
Dies ist kein Ersatz für std :: to_string und definitiv keine Antwort auf die Frage.
Verax
13
Vergessen Sie nicht, auch std :: cout zu implementieren! Es ist viel besser, nur mit vielen zusätzlichen Fehlern neu zu implementieren, als das Grundproblem herauszufinden!
JMC
Sie machen die Dinge überkomplex. Justones_char = '0' + number % 10;
phuclv