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