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

245

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

Quiero cambiar un longnúmero entero std::stringpara poder almacenarlo en un archivo. He empleado to_string()para lo 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 Stack Overflow (para g ++ versión 4.5) dice que se puede activar con el -std=c++0xindicador. ¿Qué estoy haciendo mal?

Anurag Kalia
fuente
55
Funciona con mi GCC 4.4.5 (es decir, da un error de "sobrecarga ambigua"); tal vez tu libstdc++está desactualizado?
Fred Foo
3
Se trabaja en Ideone , que utiliza GCC 4.5.1.
Kerrek SB
55
Esto funciona para mí con g ++ 4.6.3. Su error se refiere a la línea 11. Usted dice que su programa "esencialmente se ha reducido a" su código, pero ¿el código que publicó también da ese error?
Vaughn Cato
@VaughnCato - Sí, este es el programa exacto. Debería editarlo para hacerlo más claro. Además, ¿qué está haciendo ese callejero que estoy haciendo allí?
Anurag Kalia
2
Esto tampoco funciona para mí, aunque estoy usando GCC 5.3.1. Sin embargo, lo que soluciona es simplemente usar un estándar C ++ posterior, es decir, compilando con el indicador -std=c++11o superior.
Arturo don Juan

Respuestas:

212

Este es un error conocido en MinGW. Relevante Bugzilla . En la sección de comentarios puede obtener un parche para que funcione con MinGW.

Este problema se ha solucionado en distribuciones 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 distribución Nuwen MinGW también resuelve este problema.

Rapptz
fuente
2
Más discusión aquí: stackoverflow.com/questions/8542221/…
Ben
11
Estoy usando MinGW-w64 versión 4.8.1 y no funciona. Copié el programa exacto de la pregunta. Todavía obtengo el 'to_string' no es un miembro del error 'std'. Lo compilé como: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664
55
@ zam664 No puedo explicar por qué, pero me puse std::to_stringa trabajar instalando MinGW 4.8.1 (específicamente x32-4.8.1-posix-dwarf-rev5) a través de MinGW-builds . Por el contrario, to_stringlo hizo no trabajo con MinGW 4.8.1 instalado ya sea a través del instalador "MinGW-get" o el paquete TDM-CCG.
Cerran
55
El parche no era suficiente para mí, tuve que #define _GLIBCXX_USE_C99 1en C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hcomo se describe aquí
Zook
3
@Cerran "MinGW-builds" son compilaciones de MinGW-w64, un proyecto diferente a MinGW. Una razón por la que MinGW-w64 se bifurcó fue para que de hecho pudieran corregir errores como el que trata este hilo.
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' ;
}

no te olvides de incluir #include <sstream>

edgarmtze
fuente
¿Hay alguna manera de incluir también almacenado?
Jackie
Llamo a su función desde algún otro archivo fuente: patch :: to_string (errorCode) (donde errorCode es int) y el compilador me da un error en esa línea. El error es: referencia indefinida a `std :: string patch :: to_string <int> (int &) 'Sin embargo, siempre que incluya su código en el mismo compilador del archivo fuente no se queja. Estoy tratando de descubrir qué pasa.
Nikos
1
Tenga en cuenta que esta no es una solución exacta con respecto a los ceros finales. El original std::to_string(0.75)generalmente regresará "0.750000"(el formato predeterminado sprintf% d) mientras que esto regresará "0.75". Consulte aquí por motivos: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
47

Como se sugirió, esto puede ser un problema con su versión del compilador.

Intente usar el siguiente código para convertir un longa 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
fuente
No lo he ejecutado, pero gracias por resolver mi dilema inmediato. Ahora solo tengo que averiguar cómo funciona. :)
Anurag Kalia
Solo una nota de que si quieres un std::string, quieres usarlo .str()en su lugar.
Christian Mann
1
Tenga en cuenta que esta no es una solución exacta con respecto a los ceros finales. El original std::to_string(0.75)generalmente regresará "0.750000"(el formato predeterminado sprintf% d) mientras que esto regresará "0.75". Consulte aquí por motivos: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
20

Use esta función ...

    #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
fuente
2
Por favor, agregue alguna explicación (al menos comentarios) en sus respuestas, sin importar cuán fácil sea el código de entender.
vefthym
44
Es bueno tener una solución alternativa, pero creo que generalmente es mejor descubrir por qué la solución
estándar
La forma "estándar" (std :: to_string) a menudo funciona, excepto cuando no lo hace. sstream es la solución "estándar".
Nick Vence
Tenga en cuenta que esta no es una solución exacta con respecto a los ceros finales. El original std::to_string(0.75)generalmente regresará "0.750000"(el formato predeterminado sprintf% d) mientras que esto regresará "0.75". Consulte aquí por motivos: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko
12

to_string es un problema actual con Cygwin

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

Lástima, tal vez habríamos recibido una respuesta actualizada. Según @Alex, Cygwin g ++ 5.2 todavía no funciona a partir del 3 de noviembre de 2015.

El 16 de enero de 2015, Corinna Vinschen, 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,

... todavía espero obtener la funcionalidad "doble largo" en newlib en un momento.

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

Todavía sería bueno que alguien con un poco de conocimiento matemático contribuya con las funciones dobles largas que faltan a newlib.

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

Newlib está aquí .

Comunidad
fuente
Al ver cómo migraron de enviar parches por correo a git solo este año, se siente desalentador ...
rr-
8

Cambiar el estándar predeterminado de C ++

A partir de (ARCHIVO COMPILE no) de error: 'to_string' no es un miembro de 'STD'

-std = c ++ 98

Para (COMPILAR ARCHIVO EXITOSO)

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

Probado en Cygwin G ++ (GCC) 5.4.0

Joma
fuente
3

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

Aishwarya Mittal
fuente
2

El hecho es que libstdc ++ realmente es compatible std::to_stringcon los objetivos * -w64-mingw32 desde 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 antes de que el error se resolviera para MinGW-w64. Al ser diferente al código en otras respuestas, esto es una imitación de libstdc ++ (como sea posible). No requiere construcción de secuencia de cadena, pero depende de las extensiones libstdc ++. Incluso ahora estoy usando objetivos mingw-w64 en Windows, todavía funciona bien para varios otros objetivos (siempre que long doubleno se utilicen funciones).

FrankHB
fuente
2

Para cualquiera que se pregunte por qué sucede esto en Android, probablemente sea porque está utilizando una biblioteca estándar de C ++ incorrecta. Intente cambiar la biblioteca de c ++ en su build.gradle de gnustl_statica c++_staticy el estándar de c ++ en su CMakeLists.txt de -std=gnu++11a-std=c++11

kynnysmatto
fuente
1

Si usamos una solución de plantilla ligera (como se muestra arriba) como la siguiente:

namespace std {
    template<typename T>
    std::string to_string(const T &n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

Lamentablemente, tendremos problemas en algunos casos. Por ejemplo, para constante estática miembros :

hpp

class A
{
public:

    static const std::size_t x = 10;

    A();
};

cpp

A::A()
{
    std::cout << std::to_string(x);
}

Y vinculando:

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

Aquí hay una forma de resolver el problema (agregar al tipo size_t ):

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

HTH

Boris
fuente
0

en bloques de código vaya a configuración -> configuración del compilador -> bandera del compilador -> seleccione std c ++ 11 hecho. Tuve el mismo problema ... ¡ahora está funcionando!

5hifaT
fuente
-4

Esto también me sucedió a mí, simplemente escribí 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;
}
Jeff Pope
fuente
29
Esto no es un sustituto de std :: to_string y definitivamente no es una respuesta a la pregunta.
Verax
13
¡No olvides implementar std :: cout también! ¡Mucho mejor simplemente volver a implementar con muchos errores adicionales que resolver el problema raíz!
jmc
Estás haciendo las cosas demasiado complejas. Justones_char = '0' + number % 10;
phuclv