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


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

Я хочу изменить a 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 четко говорит он существует, и более ранний вопрос о переполнении стека (для версии 4.5 g++) говорит, что его можно включить с помощью -std=c++0x флаг. Что я делаю не так?

10 218

10 ответов:

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

эта проблема была исправлена в дистрибутивах MinGW-w64 выше, чем GCC 4.8.0, предоставленный проект MinGW-w64. Несмотря на название, Проект предоставляет toolchains для 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 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: g++ 5.2: 'to_string' не является членом 'std'.

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

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

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

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

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

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

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

файла составляет здесь.

изменить стандарт 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 до -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();
    }
}

НТН.

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

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