Pergunta
Estou a tentar compilar este código:
#include <cmath>
double gravity (double level) {
return 0.02 * std::round(level);
}
Mas o GCC está me dizendo:
error: 'round' is not a member of 'std'
Eu sei que eu usei o round
função muitas vezes em ISO C++98 antes.Excepcionalmente, round
e ::round
ambos trabalham.
O que dá?
Atualização:Eu estava compilando com g++ -std=c++98 -Wall -pedantic
.Mudança para std=c++0x
de obras.
Mas por que as não qualificados/anônimo round
e ::round
tanto trabalho se std::round
não?
Solução
O std::round
funções de C++11, então você precisa para compilar com o C++11 ou mais recente padrão ativado.
Outras dicas
Eu tenho feito um pouco de pesquisa, aqui está o que eu encontrei:
round
é definido no ISO C++11, pois contém a ISO C99 biblioteca padrão.
round
não é parte da ISO C++98, que usa o ISO C90 biblioteca padrão.
Que é por isso que não no espaço de nomes std
para C++98.
Mas g++
(incorretamente), incluindo o C99 cabeçalhos, mesmo quando compilado com -std=c++98 -pedantic
, o que deve desabilitar todos os não-padrão coisas:
GNU_SOURCE é definida por G++ e ...isso implica _USE_ISOC99
(a partir de http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)
É por isso que ::round
de obras.
Isso aparentemente é um bug no GCC: Por que o GCC permitir o uso de round() em C++, mesmo com o ansi e pedante bandeiras?
Outros compiladores de C++ não pode fornecer um round
função (desde que não seja exigido pela norma), então eu deveria definir o meu próprio.
como sobre
float myRoundFunc(float toRound)
{
return std::ceil(toRound - 0.5);
}
Dessa forma não há comparação e vai rodada corretamente.
tema antigo, mas talvez útil para aqueles que pesquisar no google:
//TODO: C++11 got round() function defined in math.h
float distance = sqrt((float)(plus_x * plus_x + plus_y * plus_y));
if (distance >= floor(distance)+0.5) distance = ceil(distance);
else distance = floor(distance);
Em C++03 padrão normativo de referência para a biblioteca C padrão é a ISO/IEC 9899:1990 (C90), que não incluir o round
função.Em C++11, é a ISO/IEC 9899:1999 (C99), que não incluir o round
função.
O conteúdo de <cmath>
em cada padrão de C++ são as mesmas math.h
do correspondente de biblioteca C padrão, exceto por algumas alterações (§26.8/4 em C++11):
O conteúdo desses cabeçalhos [
<cmath>
e<cstdlib>
] são as mesmas, como a biblioteca C Padrão cabeçalhos<math.h>
e<stdlib.h>
respectivamente [...]
Eles são, no entanto, no âmbito do espaço de nomes std
(§17.6.1.2/4 em C++11):
Na biblioteca padrão C++, no entanto, as declarações (exceto para nomes, que são definidos como macros em C), estão dentro do escopo de namespace (3.3.6) do espaço de nomes std.
Assim, para envolvê-lo, o round
função não está disponível em C++03, para compilar com o -std=c++0x
opção e se referem a ele como std::round
.