Это известная ошибка в MinGW. Релевантная Бугзилла . В разделе комментариев вы можете получить патч , чтобы он работал с MinGW.
Эта проблема была исправлена в дистрибутивах MinGW-w64 выше, чем GCC 4.8.0, предоставленных Проект MinGW-w64 . Несмотря на название, проект предоставляет инструментальные средства для 32-битных и 64-битных. Nuwen MinGW distro также решает эту проблему.
Если мы используем шаблон-light-solution (как показано выше), как показано ниже:
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.
Используйте эту функцию ...
#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
std::to_string(0.75)
обычно возвращает "0.750000"
(формат sprintf% d по умолчанию), пока это вернет "0.75"
. См. Здесь по причине: stackoverflow.com/a/13686914/785171
– Krzysztof Bociurko
29 September 2017 в 10:02
#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>
std::to_string(0.75)
обычно возвращает "0.750000"
(формат sprintf% d по умолчанию), пока это вернет "0.75"
. См. Здесь по причине: stackoverflow.com/a/13686914/785171
– Krzysztof Bociurko
29 September 2017 в 10:02
Вот новый ответ на старый поток. Новый появился, но был быстро отменен, Cygwin: g ++ 5.2: 'to_string' не является членом 'std' .
Слишком плохо, может быть, мы получили бы обновленный ответ. Согласно @Alex, Cygwin g ++ 5.2 все еще не работает по состоянию на 3 ноября 2015 года.
16 января 2015 года Коринна Виншен, сторонник Cygwin в Red Hat , сказал, что проблема был недостатком новолиба. Он не поддерживает большинство длинных двойных функций и поэтому не поддерживает C99.
Red Hat is
... все еще надеется получить функциональность «long double» в newlib в одной точке.
25 октября 2015 года Corrine также сказал ,
Было бы неплохо, если бы кто-то с небольшим количеством математических знаний внес бы недостающие длинные двойные функции в newlib.
Итак, у нас это есть. Может быть, один из нас, обладающий знаниями и временем, может стать героем.
Дело в том, что libstdc ++ фактически поддерживал std::to_string
в * -w64-mingw32 target с 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
не используются).
Это случилось и со мной, я просто написал краткую функцию, а не беспокоился об обновлении моего компилятора.
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;
}
Изменить стандартную версию C ++ по умолчанию
Из (ошибка COMPILE FILE FAILED): 'to_string' не является членом 'std'
-std = c ++ 98
blockquote>To (ФАЙЛ УСПЕШНОГО ФАЙЛА)
-std = c ++ 11 или -std = c ++ 14
blockquote>Протестировано на Cygwin G ++ (GCC) 5.4.0
Для тех, кто задается вопросом, почему это происходит на Android, вероятно, потому, что вы используете неправильную стандартную библиотеку c ++. Попробуйте изменить библиотеку c ++ в файле build.gradle с gnustl_static
на c++_static
и на стандарт c ++ в вашем файле CMakeLists.txt с -std=gnu++11
до -std=c++11
Как было сказано, это может быть проблемой с вашей версией компилятора.
Попробуйте использовать следующий код для преобразования 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;
}
std::string
, вы хотите использовать .str()
.
– Christian Mann
30 November 2014 в 23:34
std::to_string(0.75)
обычно возвращает "0.750000"
(формат sprintf% d по умолчанию), пока это вернет "0.75"
. См. Здесь по причине: stackoverflow.com/a/13686914/785171
– Krzysztof Bociurko
29 September 2017 в 10:02
std::to_string
для работы, установив MinGW 4.8.1 (в частности,x32-4.8.1-posix-dwarf-rev5
) через MinGW-builds . Напротив,to_string
выполнял not i> работу с MinGW 4.8.1, установленным либо с помощью «mingw-get», установщик или пакет TDM-GCC. – Cerran 16 April 2014 в 13:20#define _GLIBCXX_USE_C99 1
вC:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.h
, как описано здесь – Zook 19 March 2015 в 20:47