it-swarm.com.de

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

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?

224
Anurag Kalia

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.

206
Rapptz
#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.

109
cMinor

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;
}
45
andre

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
20
Nirav Patel

to_string ist ein aktuelles Problem mit Cygwin

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 .

12
user2603432

Ä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

5
Joma

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.

2
kynnysmatto

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).

2
FrankHB

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.

1
Boris

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

1

in Codeblocks gehen Sie zu Einstellung -> Compiler-Einstellung -> Compiler-Flag -> Wählen Sie Std.

0
ShifaT