to_string не является членом std, говорит g ++ (mingw)

Я делаю небольшую программу запоминания словарного запаса, в которой слова будут вспыхивать мне случайным образом для определения значений. Я хочу использовать стандартную библиотеку C ++, как говорит нам Бьярн Страуструп, но я сразу же столкнулся с, казалось бы, странной проблемой.

Я хочу изменить целое число long на std::string, чтобы сохранить его в файле. Я нанял to_string() на то же самое. Проблема в том, что когда я компилирую его с помощью g ++ (версия 4.7.0, как указано в флаге --‍version), он говорит:

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'

Моя программа, которая выдает эту ошибку:

#include <string>

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

Но я знаю, что это не может быть, потому что в библиотеке msdn четко сказано, что существует и более ранний вопрос о переполнении стека (для g ++ версии 4.5) говорит, что он может включаться флагом -std=c++0x. Что я делаю неправильно?


person Anurag Kalia    schedule 19.10.2012    source источник
comment
Работает с моим GCC 4.4.5 (т.е. дает неоднозначную ошибку перегрузки); может ваша libstdc++ устарела?   -  person Fred Foo    schedule 19.10.2012
comment
Он работает на Ideone, который использует GCC 4.5.1.   -  person Kerrek SB    schedule 19.10.2012
comment
У меня это работает с g ++ 4.6.3. Ваша ошибка относится к строке 11. Вы говорите, что ваша программа была существенно сокращена до вашего кода, но выдает ли опубликованный вами код эту ошибку?   -  person Vaughn Cato    schedule 19.10.2012
comment
@VaughnCato - Ага, это точная программа. Надо отредактировать, чтобы было понятнее. Плюс, что это за бродяга я там делаю?   -  person Anurag Kalia    schedule 19.10.2012
comment
У меня это тоже не работает, хотя я использую GCC 5.3.1. Однако то, что исправляет, это просто использование более позднего стандарта C ++, то есть путем компиляции с флагом -std=c++11 или выше.   -  person Arturo don Juan    schedule 05.09.2016
comment
Аналогичный вопрос, возможно, следует объединить   -  person M.M    schedule 17.08.2019


Ответы (13)


Это известная ошибка в MinGW. Соответствующая Bugzilla. В разделе комментариев вы можете получить патч, чтобы он работал с MinGW.

Эта проблема была исправлена ​​в дистрибутивах MinGW-w64 выше, чем GCC 4.8.0, предоставляемых проектом MinGW-w64 . Несмотря на название, проект предоставляет наборы инструментов как для 32-битных, так и для 64-битных версий. Nuwen MinGW distro также решает эту проблему.

person Rapptz    schedule 19.10.2012
comment
Зинг. Хороший самородок для ответа. +1 - person sehe; 19.10.2012
comment
Дальнейшее обсуждение здесь: stackoverflow.com/questions/8542221/ - person Ben; 02.11.2012
comment
Я использую MinGW-w64 версии 4.8.1, и она не работает. Скопировал точную программу из вопроса. Я все еще получаю, что «to_string» не является членом ошибки «std». Я скомпилировал его как: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp - person zam664; 02.12.2013
comment
@ zam664 Я не могу объяснить почему, но я заставил std::to_string работать, установив MinGW 4.8.1 (в частности, x32-4.8.1-posix-dwarf-rev5) через MinGW-сборки. Напротив, to_string не работал с MinGW 4.8.1, установленным либо с помощью установщика mingw-get, либо с помощью пакета TDM-GCC. - person Cerran; 16.04.2014
comment
Патча мне было недостаточно, пришлось #define _GLIBCXX_USE_C99 1 в C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.h, как описано здесь - person Zook; 19.03.2015
comment
Я думаю, что дистрибутив nuwen просто копирует файлы MinGW-w64, так что это одно и то же исправление. - person jiggunjer; 06.04.2015
comment
В тот день, когда наконец-то появился удобный стандартизированный способ преобразования чисел в строки (после всех лет рывков с itoa), кто-то просто должен его испортить. - person Tomáš Zato - Reinstate Monica; 27.11.2015
comment
У меня такая же проблема с распространением gnu-libstdc ++, предоставляемым встроенными кросс-платформенными инструментами Microsoft Visual Studio. Претендует на 4.9. Я попытался установить для _GLIBCXX_USE_C99 значение 1, но это привело к ошибкам компилятора в самом stl. (с использованием Clang 3.6) - person Trygve Skogsholm; 27.12.2015
comment
@Cerran MinGW-builds - это сборки MinGW-w64, проекта, отличного от MinGW. Одна из причин, по которой MinGW-w64 был разветвлен, заключалась в том, что они могли фактически исправить ошибки, подобные той, о которой был этот поток. - person M.M; 27.03.2016
comment
Я могу подтвердить, что ошибка все еще присутствовала в MinGW 4.9.2 и была исправлена ​​в последней версии Релиз 4.9.3. Между тем, MinGW-w64 уже предлагает GCC 5.3.0. - person Vadzim; 02.07.2016

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

не забудьте включить #include <sstream>

person edgarmtze    schedule 31.12.2013
comment
Есть ли способ также включить stod? - person Jackie; 02.02.2016
comment
Обратите внимание, что это не точное решение в отношении конечных нулей. Исходный std::to_string(0.75) обычно возвращает "0.750000" (формат sprintf% d по умолчанию), а это возвращает "0.75". Причину см. Здесь: stackoverflow.com/a/13686914/785171 - person Krzysztof Bociurko; 29.09.2017

Как и предполагалось, это может быть проблема с вашей версией компилятора.

Попробуйте использовать следующий код для преобразования long в std::string:

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

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}
person andre    schedule 19.10.2012
comment
Я не запускал его, но спасибо за решение моей ближайшей дилеммы. Теперь мне осталось только разобраться, как это работает. :) - person Anurag Kalia; 19.10.2012
comment
Просто обратите внимание, что если вам нужен std::string, вы хотите использовать вместо него .str(). - person Christian Mann; 01.12.2014
comment
Обратите внимание, что это не точное решение в отношении конечных нулей. Исходный std::to_string(0.75) обычно возвращает "0.750000" (формат sprintf% d по умолчанию), а это возвращает "0.75". Причину см. Здесь: stackoverflow.com/a/13686914/785171 - person Krzysztof Bociurko; 29.09.2017

Используйте эту функцию ...

    #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
person Nirav Patel    schedule 03.06.2014
comment
Пожалуйста, добавляйте пояснения (по крайней мере, комментарии) в свои ответы, независимо от того, насколько простой код может быть для понимания. - person vefthym; 03.06.2014
comment
Хорошо иметь обходной путь, но я думаю, что обычно лучше выяснить, почему решение std не компилируется, а не взламывать что-то вместе - person Matt Coubrough; 03.06.2014
comment
Стандартный способ (std :: to_string) часто работает, за исключением случаев, когда это не так. sstream - стандартный обходной путь. - person Nick Vence; 25.10.2014
comment
Обратите внимание, что это не точное решение в отношении конечных нулей. Исходный std::to_string(0.75) обычно возвращает "0.750000" (формат sprintf% d по умолчанию), а это возвращает "0.75". Причину см. Здесь: stackoverflow.com/a/13686914/785171 - person Krzysztof Bociurko; 29.09.2017

to_string - текущая проблема с Cygwin

Вот новый ответ на старую беседу. Новый появился, но был быстро аннулирован, Cygwin: g ++ 5.2: 'to_string' не является членом 'std'.

Жаль, может быть, мы получили бы обновленный ответ. Согласно @Alex, Cygwin g ++ 5.2 все еще не работает по состоянию на 3 ноября 2015 года.

16 января 2015 года Коринна Виншен, сопровождающая Cygwin в Red Hat , сказала о проблеме было недостатком newlib. Он не поддерживает большинство длинных двойных функций и поэтому не поддерживает C99.

Red Hat - это,

... все еще надеясь когда-нибудь добавить в newlib функцию "длинного двойника".

25 октября 2015 г. также заявила,

Было бы неплохо, если бы кто-нибудь с небольшими математическими знаниями внес бы недостающие длинные двойные функции в newlib.

Так что у нас это. Может быть, кто-то из нас, у кого есть знания и время, сможет внести свой вклад и стать героем.

Newlib находится здесь.

person Community    schedule 26.11.2015
comment
Видя, как они перешли с отправки патчей по почте на git только в этом году, это обескураживает ... - person rr-; 06.12.2015

Изменить стандарт C ++ по умолчанию

Ошибка From (COMPILE FILE FAILED): to_string не является членом std

-std = c ++ 98

Кому (СОСТАВИТЬ ФАЙЛ УСПЕШНО)

-std = c ++ 11 или -std = c ++ 14

Протестировано на Cygwin G ++ (GCC) 5.4.0

person Joma    schedule 10.06.2017

to_string () присутствует только в c ++ 11, поэтому, если версия c ++ меньше, используйте некоторые альтернативные методы, такие как sprintf или ostringstream.

person Aishwarya Mittal    schedule 29.10.2018

Дело в том, что libstdc ++ фактически поддерживает std::to_string в * -w64-mingw32 целях начиная с 4.8.0. Однако это не включает поддержку MinGW.org, Cygwin и вариантов (например, * -pc-msys от MSYS2). См. Также https://cygwin.com/ml/cygwin/2015-01/msg00245.html.

Я реализовал до устранения ошибки для MinGW-w64. В отличие от кода в других ответах, это имитация libstdc ++ (насколько это возможно). Он не требует построения строкового потока, но зависит от расширений libstdc ++. Даже сейчас я использую цели mingw-w64 в Windows, он по-прежнему хорошо работает для нескольких других целей (пока long double функции не используются).

person FrankHB    schedule 31.12.2015

Если мы воспользуемся шаблоном-световым решением (как показано выше), например, следующим:

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

К сожалению, в некоторых случаях у нас будут проблемы. Например, для членов static const:

hpp

class A
{
public:

    static const std::size_t x = 10;

    A();
};

cpp

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

И ссылка:

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

Вот один из способов решения проблемы (добавить к типу size_t):

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

HTH.

person Boris    schedule 17.02.2016

Для тех, кто задается вопросом, почему это происходит на Android, вероятно, потому, что вы используете неправильную стандартную библиотеку C ++. Попробуйте изменить библиотеку c ++ в вашем build.gradle с gnustl_static на c++_static и стандарт c ++ в вашем CMakeLists.txt с -std=gnu++11 на -std=c++11

person kynnysmatto    schedule 18.10.2016

в кодовых блоках перейдите к настройке -> настройка компилятора -> флаг компилятора -> выберите std c ++ 11 done. У меня была такая же проблема ... теперь работает!

person 5hifaT    schedule 12.12.2018

Для меня обеспечение того, чтобы у меня было:

#include <iostream>  
#include<string>  
using namespace std;

в моем файле сделал что-то вроде to_string(12345) работы.

person David Chopin    schedule 19.07.2020

Это случилось и со мной, я просто написал быструю функцию, вместо того, чтобы беспокоиться об обновлении моего компилятора.

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;
}
person Jeff Pope    schedule 18.04.2013
comment
Это не замена std :: to_string и определенно не ответ на вопрос. - person Verax; 08.10.2013
comment
Не забудьте также реализовать std :: cout! Намного лучше просто реализовать заново с множеством дополнительных ошибок, чем выяснять корень проблемы! - person jmc; 11.02.2015
comment
вы делаете вещи слишком сложными. Только 1_ - person phuclv; 28.10.2018