Erro no GCC - Função put_money

1. Erro no GCC - Função put_money

William Lima
willdoidao

(usa Ubuntu)

Enviado em 12/03/2015 - 16:34h

Estou tentando rodas esse código:

#include <iostream>
#include <iomanip>

int main()
{
long double mon = 12345; // or std::string mon = "123.45";
std::cout.imbue(std::locale("en_US.utf8"));
std::cout << std::showbase
<< "en_US: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';
std::cout.imbue(std::locale("ru_RU.utf8"));
std::cout << "ru_RU: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';
std::cout.imbue(std::locale("ja_JP.utf8"));
std::cout << "ja_JP: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';
}


Mas na hora de executar recebo a seguinte saida:

main.cpp: In function 'int main()':

main.cpp:9:31: error: 'put_money' is not a member of 'std'

<< "en_US: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';

^

main.cpp:9:64: error: 'put_money' is not a member of 'std'

<< "en_US: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';

^

main.cpp:11:31: error: 'put_money' is not a member of 'std'

std::cout << "ru_RU: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';

^

main.cpp:11:64: error: 'put_money' is not a member of 'std'

std::cout << "ru_RU: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';

^

main.cpp:13:31: error: 'put_money' is not a member of 'std'

std::cout << "ja_JP: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';

^

main.cpp:13:64: error: 'put_money' is not a member of 'std'

std::cout << "ja_JP: " << std::put_money(mon) << " or " << std::put_money(mon, true) << '\n';

^


Como posso resolver isso? Minha versão do GCC:

$ gcc --version
gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



  


2. Re: Erro no GCC - Função put_money

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/03/2015 - 17:18h

std::put_money só existe a partir do padrão do C++ aprovado em 2011. O suporte ao C++11 no GCC ainda não está completo, mas partes do padrão vêm sendo incorporadas desde pelo menos o GCC 4.3 (antes mesmo da aprovação final, baseando-se nos rascunhos daquilo que viria a ser padronizado).

Como o suporte não está completo, o default ainda é usar a linguagem padronizada em 1998. Você pode pedir o suporte ao C++11 usando a opção “-std=c++11” do g++ (ou “-std=c++0x”, em versões um pouco mais antigas).


3. Re: Erro no GCC - Função put_money

William Lima
willdoidao

(usa Ubuntu)

Enviado em 12/03/2015 - 18:08h

Consegui da seguinte maneira:

g++ -std=c++11 main.cpp

Você saberia me disser com pego esse valor formatado e jogo em uma string?





4. Re: Erro no GCC - Função put_money

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/03/2015 - 22:40h

Eu nunca trabalhei com isso. Pelo que eu li há pouco no cplusplus.com, esse manipulador está vinculado ao suporte da biblioteca padrão do C++ a locales, que por sua vez é vinculado à biblioteca de I/O.

Sendo desse modo, a forma que me parece mais óbvia de conseguir usar esse serviço para obter strings é por meio de std::ostringstream (i.e. um stream de saída que tem como destino um string). Eu só não sei se isso é muito eficiente -- se eu fosse tentar adivinhar como é feita a implementação de std::money_put (a classe por trás do manipulador std::put_money), eu chutaria que ela tem um buffer interno muito parecido com um string. Converter esse provável string interno para stream para depois obter de volta o mesmo string me parece meio redundante.