Я делаю небольшую программу для запоминания словарного запаса, где слова будут мелькать на меня случайным образом для значений. Я хочу использовать стандартную библиотеку 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
флаг. Что я делаю неправильно?
Это известная ошибка в MinGW. Соответствующий Bugzilla. В разделе комментариев вы можете получить пластырь заставить его работать с MinGW.
Эта проблема была исправлена в дистрибутивах MinGW-w64 выше GCC 4.8.0, предоставленной Проект MinGW-w64. Несмотря на название, проект предоставляет наборы инструментов для 32-битных и 64-битных систем. Nuwen MinGW дистрибутив также решает эту проблему.
#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>
Как и предполагалось, это может быть проблемой с версией вашего компилятора.
Попробуйте использовать следующий код для преобразования 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;
}
Используйте эту функцию …
#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
Вот новый ответ на старую ветку. Новый появился, но был быстро подавлен,
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 это Вот.
Изменить стандарт C ++ по умолчанию
От (COMPILE FILE FAILED) ошибка: to_string не является членом std
-станд = C ++ 98
к (СОСТАВЛЯЕТ ФАЙЛ УСПЕШНЫЙ)
-стандартный = c ++ 11 или -std = c ++ 14
Проверено на Cygwin G ++ (GCC) 5.4.0
Дело в том, что 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
функции не используются).
Для всех, кто интересуется, почему это происходит на Android, возможно, это потому, что вы используете неправильную стандартную библиотеку c ++. Попробуйте изменить библиотеку c ++ в вашем build.gradle из gnustl_static
в c++_static
и стандарт C ++ в вашем CMakeLists.txt из -std=gnu++11
в -std=c++11