c++ float to_string no es un miembro de std, dice g++(mingw)



to_string c++ format (9)

El hecho es que libstdc ++ realmente admite std::to_string en los objetivos * -w64-mingw32 desde la versión 4.8.0 . Sin embargo, esto no incluye soporte para MinGW.org, Cygwin y variantes (por ejemplo, * -pc-msys de MSYS2). Consulte también https://cygwin.com/ml/cygwin/2015-01/msg00245.html .

He implementado una solución alternativa antes de que se resolviera el error para MinGW-w64. Siendo diferente al código en otras respuestas, esto es un imitador de libstdc ++ (como sea posible). No requiere la construcción de secuencias de cadenas, pero depende de las extensiones libstdc ++. Incluso ahora estoy usando objetivos mingw-w64 en Windows, todavía funciona bien para muchos otros objetivos (siempre y cuando no se usen las funciones long double ).

Estoy creando un pequeño programa de recordatorio de vocabulario en el que las palabras se me mostrarían aleatoriamente en busca de significados. Quiero usar la biblioteca estándar de C ++ como Bjarne Stroustroup nos dice, pero me he encontrado con un problema aparentemente extraño desde el principio.

Quiero cambiar un entero long en std::string para poder almacenarlo en un archivo. He empleado to_string() para el mismo. El problema es que cuando lo compilo con g ++ (versión 4.7.0 como se menciona en su indicador de versión), dice:

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'

Mi programa que da este error es:

#include <string>

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

Pero, sé que no puede ser porque la biblioteca msdn dice claramente que existe y una pregunta anterior sobre Desbordamiento de pila (para g ++ versión 4.5) dice que se puede activar con la -std=c++0x . ¿Qué estoy haciendo mal?


Answer #1

Cambiar el estándar de C ++ predeterminado

Error de (error de compilación): 'to_string' no es miembro de 'std'

-std = c ++ 98

A (COMPILAR ARCHIVO EXITOSO)

-std = c ++ 11 o -std = c ++ 14

Probado en Cygwin G ++ (GCC) 5.4.0


Answer #2

Como se sugiere, esto puede ser un problema con la versión de su compilador.

Intente usar el siguiente código para convertir un long en std::string :

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

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}

Answer #3

to_string () solo está presente en c ++ 11, por lo tanto, si la versión de c ++ es menos, use algunos métodos alternativos como sprintf u ostringstream


Answer #4
#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' ;
}

no olvides incluir #include <sstream>


Answer #5

to_string es un problema actual con Cygwin

Aquí hay una nueva respuesta a un hilo viejo. Surgió una nueva, pero fue sofocada rápidamente, Cygwin: g ++ 5.2: 'to_string' no es miembro de 'std' .

Lástima, tal vez hubiéramos obtenido una respuesta actualizada. Según @Alex, Cygwin g ++ 5.2 aún no funciona a partir del 3 de noviembre de 2015.

El 16 de enero de 2015, Corinna Vinschen, una mantenedora de Cygwin en Red Hat, dijo que el problema era una deficiencia de newlib. No admite la mayoría de las funciones dobles largas y, por lo tanto, no es compatible con C99.

Red Hat es,

... aún con la esperanza de obtener la funcionalidad "doble larga" en newlib en un momento dado.

El 25 de octubre de 2015 Corrine también dijo ,

Aún sería bueno si alguien con un poco de conocimiento de matemáticas contribuyera con las funciones dobles largas que faltan a newlib.

Así que ahí lo tenemos. Tal vez uno de nosotros que tiene el conocimiento y el tiempo puede contribuir y ser el héroe.

Newlib está here .


Answer #6

Este es un error conocido bajo MinGW. Bugzilla relevante . En la sección de comentarios puede obtener un patch para que funcione con MinGW.

Este problema se ha solucionado en las distribuciones de MinGW-w64 superiores a GCC 4.8.0 proporcionadas por el proyecto MinGW-w64 . A pesar del nombre, el proyecto proporciona cadenas de herramientas para 32 bits junto con 64 bits. La distro Nuwen MinGW también resuelve este problema.


Answer #7

Esto también me pasó a mí, acabo de escribir una función rápida en lugar de preocuparme por actualizar mi compilador.

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

Answer #8

Si alguien se pregunta por qué sucede esto en Android, es probable que esté usando una biblioteca estándar de c ++ incorrecta. Intente cambiar la biblioteca de c ++ en su build.gradle de gnustl_static a c++_static y el estándar de c ++ en su CMakeLists.txt de -std=gnu++11 a -std=c++11





tostring