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


245

Я складаю невелику програму запам’ятовування словника, де слова будуть спалахувати на мене випадково за значеннями. Я хочу використовувати стандартну бібліотеку C ++, як розповідає нам Bjarne Stroustroup, але я зіткнувся з, здавалося б, дивною проблемою прямо за воротами.

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

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-збірки . На відміну від цього , to_stringзробив НЕ робота з MinGW 4.8.1 встановлений або через «MinGW-отримати» монтажником або пакет TDM-GCC.
Серран

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
Krzysztof Bociurko

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

Я не керував цим, але дякую за вирішення моєї негайної дилеми. Тепер мені залишається лише розібратися, як це працює. :)
Анураг Калія

Просто зауважте, що якщо ви хочете std::string, ви хочете використовувати його .str()замість.
Крістіан Манн

1
Зверніть увагу, що це не є точним рішенням щодо нульових знаків. Оригінал std::to_string(0.75)зазвичай повертається "0.750000"(формат sprintf% d за замовчуванням), поки він повертається "0.75". Дивіться тут причину: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

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
Krzysztof Bociurko

12

to_string - поточна проблема із Cygwin

Ось нова відповідь на стару тему. Вийшов новий, але його швидко скасували, Cygwin: g ++ 5.2: 'to_string' не є членом 'std' .

Шкода, можливо, ми б отримали оновлену відповідь. За даними @Alex, Cygwin g ++ 5.2 ще не працює з 3 листопада 2015 року.

16 січня 2015 року Корінна Віншен, керівник компанії Cygwin у Red Hat, заявила про проблему - це нестача новолібу. Він не підтримує найбільш довгі подвійні функції, і тому C99 не обізнаний.

Red Hat є,

... все ще сподіваючись отримати "довгий подвійний" функціонал в newlib в один момент.

25 жовтня 2015 року Corrine також сказала :

Ще було б добре, якби хтось, маючи трохи математичних знань, сприяв би відсутності довгих подвійних функцій у newlib.

Так що там у нас є. Можливо, хтось із нас, хто має знання та час, може внести свій вклад і стати героєм.

Ньюліб тут .


Бачачи, як вони мігрували з відправлення патчів через пошту, щоб вони ще тільки цього року, це перешкоджає ...
rr-

8

Змініть стандартний C ++ стандарт

Помилка з (КОМПЛІКУВАННЯ ФАЙЛУ НЕВЕРШЕНО): "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

Якщо ми використовуємо шаблон-світло-рішення (як показано вище), наприклад:

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

HTH.


0

у кодових блоках перейдіть до налаштування -> налаштування компілятора -> прапор компілятора -> виберіть std 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.