문제

이 코드를 컴파일하려고 합니다.

#include <cmath>
double gravity (double level) {
    return 0.02 * std::round(level);
}

하지만 GCC는 나에게 이렇게 말합니다.

error: 'round' is not a member of 'std'

나는 내가 사용한 적이 있다는 것을 안다. round 여러 번 기능 ISO C++98 전에.비정상적으로, round 그리고 ::round 둘 다 작동합니다.

무엇을 제공합니까?

업데이트:나는 함께 컴파일하고 있었다 g++ -std=c++98 -Wall -pedantic.다음으로 전환 중 std=c++0x 공장.

그런데 왜 자격이 없는/익명인이 round 그리고 ::round 둘 다 작동하는 경우 std::round 그렇지 않습니까?

도움이 되었습니까?

해결책

그만큼 std::round 함수는 C++11이므로 C++11 또는 최신 표준이 활성화된 상태로 컴파일해야 합니다.

다른 팁

나는 약간의 연구를 해왔고, 내가 찾은 것은 다음과 같습니다:

round 에 정의되어 있습니다 ISO C++11, 여기에는 ISO C99 표준 라이브러리.

round 의 일부가 아닙니다 ISO C++98, 이는 ISO C90 표준 라이브러리.

그렇기 때문에 네임스페이스에 없습니다. std ~을 위한 C++98.

하지만 g++ (잘못) 다음을 포함합니다. C99 헤더는 다음과 같이 컴파일된 경우에도 마찬가지입니다. -std=c++98 -pedantic, 이는 모든 비표준 항목을 비활성화해야 합니다.

GNU_SOURCE는 G++에 의해 정의되며 ..._USE_ISOC99를 의미합니다.

(에서 http://gcc.gnu.org/ml/gcc/2002-09/msg00580.html)

이는 이유 ::round 공장.

이것은 분명히 GCC의 버그입니다. 왜 GCC는 ansi 및 pedantic 플래그와 함께 C++에서 round() 사용을 허용합니까?

다른 C++ 컴파일러는 round 함수(표준에서 요구하지 않기 때문에)를 직접 정의해야 합니다.

어때?

float myRoundFunc(float toRound)
{
  return std::ceil(toRound - 0.5);
}

이렇게 하면 비교가 없으며 적절하게 반올림됩니다.

오래된 주제이지만 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);

C++03 표준에서는 표준 C 라이브러리 ISO/IEC 9899:1990(C90)입니다. 하지 않습니다 포함하다 round 기능.C++11에서는 ISO/IEC 9899:1999(C99)입니다. 하다 포함하다 round 기능.

내용은 <cmath> 각 C++ 표준에서는 다음과 같습니다. math.h 몇 가지 변경 사항(C++11의 §26.8/4)을 제외하고 해당 표준 C 라이브러리에서:

이 헤더의 내용은 [<cmath> 그리고 <cstdlib>]는 표준 C 라이브러리 헤더와 동일합니다. <math.h> 그리고 <stdlib.h> 각각 [...]

그러나 이들은 다음의 네임스페이스 범위에 있습니다. std (C++11의 §17.6.1.2/4):

그러나 C++ 표준 라이브러리에서는 선언(C에서 매크로로 정의된 이름 제외)이 std 네임스페이스의 네임스페이스 범위(3.3.6) 내에 있습니다.

그래서 마무리하자면, round 함수는 C++03에서는 사용할 수 없으므로 다음과 같이 컴파일하십시오. -std=c++0x 옵션으로 참조하세요. std::round.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top