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


245

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

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

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флага. Что я делаю не так?


5
Работает с моим GCC 4.4.5 (т.е. выдает ошибку «неоднозначной перегрузки»); может у тебя libstdc++устарела?
Фред Фу

3
Он работает на Ideone , который использует GCC 4.5.1.
Керрек С.Б.

5
Это работает для меня с g ++ 4.6.3. Ваша ошибка относится к строке 11. Вы говорите, что ваша программа «по существу была сокращена до» вашего кода, но выдает ли код, который вы опубликовали, эту ошибку?
Вон Катон

@VaughnCato - Да, это точная программа. Я должен отредактировать это, чтобы сделать это более ясным. Плюс, что это заблудился, когда я там делаю?
Анураг Калия

2
Это также не работает для меня, хотя я использую GCC 5.3.1. Однако, что исправляет это, просто используя более поздний стандарт C ++ - то есть, компилируя с флагом -std=c++11или выше.
Артуро дон Хуан,

Ответы:


212

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

Эта проблема была исправлена ​​в дистрибутивах MinGW-w64 выше GCC 4.8.0, предоставленных проектом MinGW-w64 . Несмотря на название, проект предоставляет наборы инструментов для 32-битных и 64-битных систем. Дистрибутив Nuwen MinGW также решает эту проблему.


2
Дальнейшее обсуждение здесь: stackoverflow.com/questions/8542221/…
Бен

11
Я использую MinGW-w64 версии 4.8.1, и она не работает. Я скопировал точную программу из вопроса. Я все еще получаю, что 'to_string' не является членом ошибки 'std'. Я скомпилировал его как: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664

5
@ zam664 Я не могу объяснить почему, но я приступил std::to_stringк работе, установив MinGW 4.8.1 (в частности, x32-4.8.1-posix-dwarf-rev5) через MinGW-builds . В отличие от этого , to_stringсделал не работа с MinGW 4.8.1 установлен либо через «MinGW-получить» установщиком или пакет TDM-GCC.
Cerran

5
Пластырь не было достаточно для меня, я должен был #define _GLIBCXX_USE_C99 1в , C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hкак описано здесь
Zook

3
@Cerran "MinGW-builds" - это сборки MinGW-w64, проекта, отличного от MinGW. Одна из причин, по которой MinGW-w64 был раздроблен, заключалась в том, что они могли на самом деле исправлять ошибки, подобные той, о которой говорил этот поток.
ММ

116
#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>


Есть ли способ включить Stod?
Джеки,

Я вызываю вашу функцию из какого-то другого исходного файла: patch :: to_string (errorCode) (где errorCode - int), и компилятор выдает мне ошибку в этой строке. Ошибка: неопределенная ссылка на `std :: string patch :: to_string <int> (int &) 'Однако всякий раз, когда я включаю ваш код в тот же компилятор исходного файла, не жалуется. Я пытаюсь понять, что не так.
Никос

1
Обратите внимание, что это не является точным решением в отношении конечных нулей. Оригинал std::to_string(0.75)обычно возвращается "0.750000"(формат sprintf% d по умолчанию), в то время как он возвращается "0.75". См. Здесь причину: stackoverflow.com/a/13686914/785171
Кшиштоф Бочюрко

47

Как и предполагалось, это может быть проблемой с версией вашего компилятора.

Попробуйте использовать следующий код для преобразования 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;
}

Я не управлял этим, но спасибо за решение моей непосредственной дилеммы. Теперь мне осталось только выяснить, как это работает. :)
Anurag Kalia

Просто обратите внимание, что если вы хотите std::string, вы хотите использовать .str()вместо этого.
Кристиан Манн,

1
Обратите внимание, что это не является точным решением в отношении конечных нулей. Оригинал std::to_string(0.75)обычно возвращается "0.750000"(формат sprintf% d по умолчанию), в то время как он возвращается "0.75". См. Здесь причину: stackoverflow.com/a/13686914/785171
Кшиштоф Бочюрко

20

Используйте эту функцию ...

    #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

2
Пожалуйста, добавьте некоторые объяснения (по крайней мере, комментарии) в ваши ответы, независимо от того, насколько простым может быть код для понимания.
Vefthym

4
Хорошо иметь обходной путь, но я думаю, что лучше всего выяснить, почему решение std не компилируется, а не взламывать что-то вместе
Мэтт Куброу

«Стандартный» способ (std :: to_string) часто работает - кроме случаев, когда это не так. sstream - это «стандартный» обходной путь.
Ник Венс

Обратите внимание, что это не является точным решением в отношении конечных нулей. Оригинал std::to_string(0.75)обычно возвращается "0.750000"(формат sprintf% d по умолчанию), в то время как он возвращается "0.75". См. Здесь причину: stackoverflow.com/a/13686914/785171
Кшиштоф Бочюрко

12

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 есть,

... все еще надеясь получить функциональность "long double" в newlib в один момент.

25 октября 2015 года Коррин также сказала :

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

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

Ньюлиб здесь .


Видя, как они мигрировали от отправки патчей по почте на git только в этом году, это обескураживает ...
rr-

8

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

Ошибка From (COMPILE FILE FAILED): to_string не является членом std

-std = C ++ 98

Кому (ФАЙЛ УСПЕШНЫЙ)

-std = c ++ 11 или -std = c ++ 14

Проверено на Cygwin G ++ (GCC) 5.4.0


3

to_string () присутствует только в c ++ 11, поэтому, если версия c ++ меньше, используйте некоторые альтернативные методы, такие как sprintf или ostringstream


2

Дело в том, что 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функции не используются).


2

Для всех, кто интересуется, почему это происходит на Android, возможно, потому, что вы используете неправильную стандартную библиотеку c ++. Попробуйте изменить библиотеку c ++ в вашем build.gradle с gnustl_staticна c++_staticи стандарт c ++ в вашем CMakeLists.txt с -std=gnu++11на-std=c++11


1

Если мы используем template-light-solution (как показано выше), как показано ниже:

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

К сожалению, у нас будут проблемы в некоторых случаях. Например, для статических членов 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();
    }
}

НТН.


0

в кодовых блоках перейдите к настройке -> настройка компилятора -> флаг компилятора -> выбрать стандарт c ++ 11 готово. У меня была такая же проблема ... теперь она работает!


-4

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

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

29
Это не замена std :: to_string и, безусловно, не ответ на вопрос.
Verax

13
Не забудьте также реализовать std :: cout! Гораздо лучше просто заново реализовать с множеством дополнительных ошибок, чем выяснить проблему с корнем!
JMC

Вы делаете вещи слишком сложными. Простоones_char = '0' + number % 10;
phuclv
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.