& Lt; & строка GT; В заголовке на MinGW отсутствует много функциональности [дубликат]

  • ArrayList не имеет ограничения типа для хранения данных, то есть это не тип Safe. Вы можете хранить все в ArrayList. Фактически, тот же ArrayList может хранить несколько типов объектов.
  • В Generic List (List) T означает тип данных, то есть string, int, DateTime и т. Д. Таким образом, он будет хранить только определенные типы объектов на основе какой тип данных был указан во время деклараций, т.е. это тип Safe. Таким образом, если у вас есть общий список строк, вы можете хранить только строковые значения, все остальное даст ошибку компиляции. Получение данных назад также без проблем и не требует преобразования типов
218
задан Community 23 May 2017 в 12:18
поделиться

11 ответов

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

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

197
ответ дан M.M 19 August 2018 в 11:16
поделиться
  • 1
    Спасибо! У меня не хватило смелости указать пальцем на могучего g ++. Даже если я буду делать это в будущем сейчас (в крайнем случае), теперь я знаю официальное место, чтобы подтвердить мои теории заговора. Спасибо! – Anurag Kalia 19 October 2012 в 15:17
  • 2
    Я использую MinGW-w64 версии 4.8.1, и он не работает. Я скопировал точную программу из вопроса. Я все равно получаю, что 'to_string' не является членом ошибки std. Я скомпилировал его как: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp – zam664 2 December 2013 в 18:58
  • 3
    @ zam664 Я не могу объяснить, почему, но я получил std::to_string для работы, установив MinGW 4.8.1 (в частности, x32-4.8.1-posix-dwarf-rev5) через MinGW-builds . Напротив, to_string выполнял not работу с MinGW 4.8.1, установленным либо с помощью «mingw-get», установщик или пакет TDM-GCC. – Cerran 16 April 2014 в 13:20
  • 4
    Патча было недостаточно для меня, мне пришлось #define _GLIBCXX_USE_C99 1 в C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.h, как описано здесь – Zook 19 March 2015 в 20:47
  • 5
    @Cerran & quot; MinGW-builds & quot; являются сборками MinGW-w64, другого проекта для MinGW. Одна из причин, по которой MinGW-w64 была разветвлена, заключалась в том, что они могли на самом деле исправить ошибки, подобные тем, о которых шла речь. – M.M 27 March 2016 в 07:33

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

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

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

1
ответ дан Boris 19 August 2018 в 11:16
поделиться

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

    #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
20
ответ дан Cal 19 August 2018 в 11:16
поделиться
  • 1
    Пожалуйста, добавьте некоторое объяснение (комментарии, по крайней мере) в свои ответы, независимо от того, насколько легко код может быть понят. – vefthym 3 June 2014 в 07:53
  • 2
    Хорошо иметь обходное решение, но я думаю, что обычно лучше всего понять, почему решение std не компилируется, а что-то взломать – Matt Coubrough 3 June 2014 в 07:56
  • 3
    «Стандартная» путь (std :: to_string) часто работает - за исключением случаев, когда этого не происходит. sstream является "стандартным" обходной путь. – Nick Vence 25 October 2014 в 01:47
  • 4
    Обратите внимание, что это не точное решение в отношении конечных нулей. Первоначальный std::to_string(0.75) обычно возвращает "0.750000" (формат sprintf% d по умолчанию), пока это вернет "0.75". См. Здесь по причине: stackoverflow.com/a/13686914/785171 – Krzysztof Bociurko 29 September 2017 в 10:02
#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>

104
ответ дан cMinor 19 August 2018 в 11:16
поделиться
  • 1
    Есть ли способ включить и стоп? – Jackie 2 February 2016 в 18:34
  • 2
    Я вызываю вашу функцию из другого исходного файла: patch :: to_string (errorCode) (где errorCode is int), а компилятор дает мне ошибку в этой строке. Ошибка: undefined ссылка на `std :: string patch :: to_string & lt; int & gt; (int & amp;) 'Однако всякий раз, когда я включаю ваш код в тот же исходный файл, компилятор не жалуется. Я пытаюсь понять, что случилось. – Nik-Lz 5 October 2016 в 19:06
  • 3
    Обратите внимание, что это не точное решение в отношении конечных нулей. Первоначальный std::to_string(0.75) обычно возвращает "0.750000" (формат sprintf% d по умолчанию), пока это вернет "0.75". См. Здесь по причине: stackoverflow.com/a/13686914/785171 – Krzysztof Bociurko 29 September 2017 в 10:02

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 is

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

25 октября 2015 года Corrine также сказал ,

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

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

Здесь Newlib .

10
ответ дан Community 19 August 2018 в 11:16
поделиться
  • 1
    Потрясающие! Я хочу, чтобы больше людей это понимали. – Anurag Kalia 26 November 2015 в 18:37
  • 2
    Видя, как они перешли от отправки патчей по почте в git только в этом году, он чувствует себя обескураживающим ... – rr- 6 December 2015 в 14:59

Дело в том, что libstdc ++ фактически поддерживал std::to_string в * -w64-mingw32 target с 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
ответ дан FrankHB 19 August 2018 в 11:16
поделиться

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

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;
}
-5
ответ дан Jeff Pope 19 August 2018 в 11:16
поделиться
  • 1
    +1, но он не делает отрицательных чисел (вообще). – dreamlax 13 June 2013 в 01:29
  • 2
    Это не является заменой std :: to_string и определенно не является ответом на вопрос. – Verax 8 October 2013 в 09:34
  • 3
    благодаря! это спасло меня много времени! – Mr Alexander 8 October 2014 в 08:22
  • 4
    Не забудьте также реализовать std :: cout! Намного лучше просто выполнить повторную реализацию с большим количеством дополнительных ошибок, чем выяснить корневую проблему! – jmc 11 February 2015 в 17:15
  • 5

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

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

-std = c ++ 98

To (ФАЙЛ УСПЕШНОГО ФАЙЛА)

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

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

4
ответ дан Joma 19 August 2018 в 11:16
поделиться

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

2
ответ дан kynnysmatto 19 August 2018 в 11:16
поделиться

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

Попробуйте использовать следующий код для преобразования 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;
}
45
ответ дан Wolf 19 August 2018 в 11:16
поделиться
  • 1
    Я не побежал, но благодарю вас за решение моей непосредственной дилеммы. Теперь мне нужно только выяснить, как это работает. :) – Anurag Kalia 19 October 2012 в 15:18
  • 2
    Просто обратите внимание, что если вы хотите std::string, вы хотите использовать .str(). – Christian Mann 30 November 2014 в 23:34
  • 3
    Обратите внимание, что это не точное решение в отношении конечных нулей. Первоначальный std::to_string(0.75) обычно возвращает "0.750000" (формат sprintf% d по умолчанию), пока это вернет "0.75". См. Здесь по причине: stackoverflow.com/a/13686914/785171 – Krzysztof Bociurko 29 September 2017 в 10:02
1
ответ дан Aishwarya Mittal 30 October 2018 в 23:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: