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 флаг. Что я делаю неправильно?

221

Решение

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

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

204

Другие решения

#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>

107

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

Попробуйте использовать следующий код для преобразования 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;
}
45

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

    #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

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 есть,

… все еще надеясь получить функциональность «long double» в newlib в
один пункт.

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

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

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

Newlib это Вот.

10

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

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

-станд = C ++ 98

к (СОСТАВЛЯЕТ ФАЙЛ УСПЕШНЫЙ)

-стандартный = c ++ 11 или -std = c ++ 14

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

4

Дело в том, что 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 функции не используются).

2

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

2
По вопросам рекламы [email protected]