To_string не является членом std, говорит g++ (mingw)
Я делаю небольшой словарь, запоминающий программу, где слова будут случайным образом мелькать на меня для значений. Я хочу использовать стандартную библиотеку С++, как говорит нам Bjarne Stroustroup, но я столкнулся с кажущейся странной проблемой прямо из ворот.
Я хочу изменить целое число 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
. Что я делаю неправильно?
Ответы
Ответ 1
Это известная ошибка в MinGW. Релевантный Bugzilla. В разделе комментариев вы можете получить патч чтобы он работал с MinGW.
Эта проблема была исправлена в дистрибутивах MinGW-w64 выше GCC 4.8.0, предоставленных проектом MinGW-w64. Несмотря на название, проект предоставляет инструментальные средства для 32-битных и 64-битных. Nuwen MinGW distro также решает эту проблему.
Ответ 2
#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>
Ответ 3
Как и предполагалось, это может быть проблемой с вашей версией компилятора.
Попробуйте использовать следующий код для преобразования 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;
}
Ответ 4
Используйте эту функцию...
#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
Ответ 5
to_string - текущая проблема с Cygwin
Здесь новый ответ на старый поток. Новый появился, но был быстро отменен,
Cygwin: g++ 5.2: 'to_string не является членом' std.
Слишком плохо, может быть, мы получили бы обновленный ответ. Согласно @Alex, Cygwin g++ 5.2 все еще не работает с 3 ноября 2015 года.
16 января 2015 года Corinna Vinschen, сопровождающий Cygwin в Red Hat сказал, что проблема была недостатком newlib. Он не поддерживает большинство длинных двойных функций и поэтому не поддерживает C99.
Red Hat,
... все еще надеясь получить "длинную двойную" функциональность в newlib на одна точка.
25 октября 2015 года Corrine также сказал,
Было бы неплохо, если бы кто-нибудь, обладающий небольшим количеством математических знаний, вносят недостающие длинные двойные функции в newlib.
Итак, у нас это есть. Может быть, один из нас, у кого есть знание, и время, может внести свой вклад и стать героем.
Newlib здесь.
Ответ 6
Изменить стандартный стандарт С++
От (ошибка COMPILE FILE FAILED): 'to_string' не является членом 'std'
-std = С++ 98
К (УСПЕШНЫЙ ФАЙЛ УСПЕХА)
-std = С++ 11 или -std = С++ 14
Протестировано на Cygwin g++ (GCC) 5.4.0
Ответ 7
Дело в том, что libstdС++ фактически поддерживал 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. Будучи отличным от кода в других ответах, это мимика libstdС++ (насколько это возможно). Он не требует строкового потока, но зависит от расширений libstdС++. Даже сейчас я использую целевые объекты mingw-w64 в Windows, он по-прежнему хорошо работает для нескольких других целей (пока функции long double
не используются).
Ответ 8
Для кого-то интересно, почему это происходит на Android, вероятно, потому, что вы используете неправильную стандартную библиотеку С++. Попробуйте изменить библиотеку С++ в файле build.gradle от gnustl_static
до c++_static
и в стандарте С++ в CMakeLists.txt от -std=gnu++11
до -std=c++11
Ответ 9
Если мы используем шаблон-light-solution (как показано выше), как показано ниже:
namespace std {
template<typename T>
std::string to_string(const T &n) {
std::ostringstream s;
s << n;
return s.str();
}
}
К сожалению, в некоторых случаях у нас будут проблемы. Например, для статических константных членов:
HPP
class A
{
public:
static const std::size_t x = 10;
A();
};
каст
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();
}
}
НТН.
Ответ 10
to_string() присутствует только в c++ 11, поэтому, если версия c++ меньше, используйте некоторые альтернативные методы, такие как sprintf или ostringstream
Ответ 11
в кодовых блоках перейдите к настройке → настройка компилятора → флаг компилятора → выберите стандартное ядро С++ 11 готово. У меня была такая же проблема... теперь она работает!
Ответ 12
Это случилось со мной, я просто написал краткую функцию, а не беспокоился об обновлении моего компилятора.
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;
}