std :: stoi не существует в g ​​++ 4.6.1 на MinGW - PullRequest
31 голосов
/ 17 декабря 2011

Я пытался скомпилировать эту простую программу на 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) может вести себя так же, как на Linux.

Ответы [ 4 ]

45 голосов
/ 17 декабря 2011

Это результат нестандартного объявления 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, но многие другие функции преобразования должны быть доступны.

4 голосов
/ 02 августа 2015

Это исправлено в 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 для переключения.

0 голосов
/ 11 октября 2016

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

0 голосов
/ 21 августа 2016

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

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