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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top