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 сработало для меня.