Std:: stoi не существует в g ​​++ 4.6.1 на MinGW

Я попытался скомпилировать эту простую программу на IdeOne (которая использует gcc 4.5.1) и на моем Linux-компьютере (который использует что-то вроде 4.6.4):

#include <string>
#include <iostream>

int main() {
     std::cout << std::stoi("32") << std::endl;
}

И он отлично компилируется и выводит 32. Однако, когда я пытаюсь скомпилировать его на моем компьютере с Windows с MinGW и gcc 4.6.1, я получаю эту ошибку:

test.cpp: In function 'int main()':
test.cpp:5:19: error: 'stoi' is not a member of 'std'

То же самое происходит с std::stoul и т.д. По какой-то причине существует ли std::stoi и семья в MinGW? Я думал, что gcc на MinGW (sh | w) ould ведет себя так же, как на Linux.

Ответ 1

Это результат нестандартного объявления vswprintf в Windows. Стандартная библиотека GNU определяет _GLIBCXX_HAVE_BROKEN_VSWPRINTF на этой платформе, которая, в свою очередь, отключает функции преобразования, которые вы пытаетесь использовать. Подробнее об этой проблеме и макросе можно прочитать здесь: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522.

Если вы хотите изменить файлы заголовков, распространяемые с помощью MinGW, вы можете обойти это, удалив макрос !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) в строке 2754 .../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h и добавив его обратно в строки 2905 - 2965 ( строки, которые ссылаются на std::vswprintf). Вы не сможете использовать функции std::to_wstring, но многие другие функции преобразования должны быть доступны.

Ответ 2

Это исправлено в MinGW-w64, вилке исходного проекта MinGW, который действительно заинтересован в исправлении ошибок, подобных этому. Он был исправлен с g++ 4.9.2 и, возможно, раньше.


Примечание: для тех, кто пришел сюда, которые выполнили установку CodeBlocks по умолчанию (которая поставляется со старым, сломанным MinGW) и хотят обновить компилятор, см. этот ответ.

Вы можете использовать любую сборку MinGW-w64: я использую самоинсталлятор из mingw-builds.org, тогда как этот ответ использует TDM-GCC-64. Если вам нужна как 64-битная, так и 32-битная компиляция, вам необходимо установить и добавить 2 новых компилятора: mingw-w64 64-bit и mingw-w64 32-bit. Он НЕ поддерживает использование одной установки g++ с переключателем -m32 или -m64 для переключения.

Ответ 3

Я использую MinGW 4.9.3-1. Эта проблема, похоже, все еще существует. В качестве обходного пути я использовал другой способ получения целых чисел из строк.

int rows, columns;
sscanf(argv[1], "%d", &rows);
sscanf(argv[2], "%d", &columns);

Ответ 4

Использовать Mingw-w64. У меня была эта же проблема, и использование Mingw-w64 сработало для меня.