to string не является членом std, говорит g++ (mingw)

Я делаю небольшую программу запоминания словаря, где слова будут мелькать у меня случайным образом для значений. Я хочу использовать стандартную библиотеку C++, как говорит нам Бьярне Страуструп, но я столкнулся с кажущейся странной проблемой прямо из ворот.

Я хочу изменить long целое число в std::string чтобы иметь возможность хранить его в файле. Я нанял to_string() то же самое. Проблема в том, когда я компилирую его с g++ (версия 4.7.0, как указано в его -- версия флаг), он говорит:

PS C:UsersAnuragSkyDriveCollegePrograms> 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 четко говорит она существует и ранее заданный вопрос on Stack Overflow (для G++ версии 4.5) говорит, что его можно включить с помощью -std=c++0x флаг. Что я делаю не так?

10 ответов


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

эта проблема была исправлена в дистрибутивах MinGW-w64 выше GCC 4.8.0, предоставленных проект MinGW-w64. Несмотря на название, Проект предоставляет toolchains для 32-разрядных вместе с 64-разрядными. The 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 to 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

to_string является текущей проблемой с Cygwin

вот новый ответ на старый поток. Появился новый, но его быстро уничтожили., в Cygwin: г++ 5.2: ‘to_string’ не является членом ‘СТД’.

слишком плохо, возможно, мы получили бы обновленный ответ. Согласно @Alex, Cygwin g++ 5.2 по-прежнему не работает по состоянию на 3 ноября 2015 года.

16 января 2015 года Коринна Виншен, сопровождающий Cygwin в Red Hat сказал проблема был недостатком newlib. Он не поддерживает большинство длинных двойных функций и поэтому не знает C99.

красная шляпа,

... все еще надеясь получить" длинную двойную " функциональность в newlib at одна точка.

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

все равно было бы здорово, если бы кто-то с немного математических знаний внесите недостающие длинные двойные функции для файла.

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

Newlib является здесь.


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

С (ошибка компиляции файла) ошибка: "to_string" не является членом "std"

- std=c++98

до (КОМПИЛЯЦИЯ ФАЙЛА ПРОШЛА УСПЕШНО)

- std=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++ в вашей сборке.Gradle в с gnustl_static до c++_static и стандарт c++ в ваших CMakeLists.txt из -std=gnu++11 to -std=c++11


если мы используем шаблон-светло-решение (как показано выше), как показано ниже:

namespace std {
    template<typename T>
    std::string to_string(const T &n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

к сожалению, в некоторых случаях у нас будут проблемы. Например, для static const участники:

ГЭС

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

вот один из способов решить проблему (добавить в тип реализация):

namespace std {
    std::string to_string(size_t n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

HTH.


Это случилось со мной, я просто набросал функцию, а не беспокоиться об обновлении моего компилятора.

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