it-swarm-pt.tech

std :: stoi não existe no g ++ 4.6.1 no MinGW

Eu tentei compilar este programa simples no IdeOne (que usa o gcc 4.5.1) e no meu computador Linux (que usa algo como 4.6.4):

#include <string>
#include <iostream>

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

E compila perfeitamente e produz 32. No entanto, quando tento compilá-lo no meu computador Windows com MinGW e gcc 4.6.1, recebo este erro:

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

O mesmo acontece com std::stoul, etc. O std::stoi e a família não existem no MinGW por algum motivo? Eu pensei que o gcc no MinGW (sh | w) deveria se comportar da mesma maneira que no Linux.

31
Seth Carnegie

Isso é resultado de uma declaração não padrão de vswprintf no Windows. A biblioteca padrão GNU define _GLIBCXX_HAVE_BROKEN_VSWPRINTF nesta plataforma, que por sua vez desativa as funções de conversão que você está tentando usar. Você pode ler mais sobre este problema e macro aqui: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37522 .

Se você estiver disposto a modificar os arquivos de cabeçalho distribuídos com o MinGW, poderá resolver isso removendo a macro !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF) na linha 2754 do .../lib/gcc/mingw32/4.6.1/include/c++/bits/basic_string.h e adicionando-a nas linhas 2905 a 2965 (as linhas que fazem referência std::vswprintf). Você não poderá usar as funções std::to_wstring, mas muitas das outras funções de conversão devem estar disponíveis.

45
DRH

Isso é corrigido em MinGW-w64 , um fork do projeto MinGW original que realmente está interessado em corrigir bugs como este. Foi corrigido a partir do g ++ 4.9.2, e talvez mais cedo.


Nota: para as pessoas que vêm aqui que fizeram uma instalação padrão de CodeBlocks (que vem com o antigo e quebrado MinGW), e querem atualizar o compilador, veja esta resposta

Você pode usar qualquer compilação do MinGW-w64: eu uso o auto-instalador do mingw-builds.org, enquanto que a resposta usa o TDM-GCC-64. Se você quer a compilação de 64 bits e 32 bits, você precisa instalar e adicionar 2 novos compiladores: mingw-w64 de 64 bits e mingw-w64 de 32 bits. Ele NÃO suporta o uso de uma instalação do g ++ com o switch -m32 ou -m64 para alternar.

4
M.M

Use o Mingw-w64. Eu tive esse mesmo problema e usando o Mingw-w64 funcionou para mim.

0
Sean Nolan

Eu estou usando o MinGW 4.9.3-1. Esse problema parece ainda estar lá. Como solução, usei a outra maneira de obter números inteiros de strings. 

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