2010-11-24 3 views
5

왜이 기능이 작동하지 않습니까? 오류 1 오류 C2057 :numeric_limits 문제

enum : long {MaxValue = std::numeric_limits<long int>::max()}; 

나는 오류를 받고 있어요 예상 상수 식 그것에 대해 일정하지 무엇
? 긴 int의 한계는 컴파일 타임에 알려져 있으므로 무엇이 문제입니까?

+0

'static constexpr T max(); // (C++ 11 이후)'... 그러나 VS 2012에서 많은 C++ 11 기능을 지원하지만 Visual Studio 2012에서는 여전히 컴파일 타임 상수로 작동하지 않습니다 (여전히 C2057 제공). –

답변

5

문제는 std::numeric_limits<long int>::max() 기능은 상수 값을 반환하지만, (climits 헤더 참조) 런타임에 라고하고

은 아마 방금 대신 LONG_MAX 값을 사용할 수 있습니다 컴파일 시간에 상수 값을해야 할 것이 무엇입니까?

+0

답장을 보내 주셔서 감사합니다 +1. 이 비논리적 인 행동을 우회 할 수있는 (법적) 방법이 있습니까? –

+3

C++ 0X는 이런 종류의 문제를 해결하는 데 도움이되는'constexpr'을 소개합니다. – icecrime

+3

부스트 또한'boost :: integer_traits' 클래스 템플릿을'const_min'과'const_max' 멤버로 가지고 있습니다. – Philipp

1

예,하지만 컴파일 타임에 함수를 실행할 수 없습니다. max()

+0

참조. http://en.wikipedia.org/wiki/Compile_time_function_execution. 아마 GCC는 CTFE를 지원하지 않지만,이 문맥에서 max()는 인라인 될 가능성이 높으며 상수를 반환하기 때문에 컴파일 타임에 GCC에 의해 잘 평가 될 수 있습니다. –

3

다른 말처럼, 당신은 상수 표현이 필요합니다 (함수는 적합하지 않습니다). 결국 C++ 1x는 함수를 포함하여 더 넓은 범위의 상수 표현을 지원할 것입니다. n2235 및 Bjarne Stroustrup의 FAQ entry을 참조하십시오.