정수 상수 표현식이어야합니다. 즉 5.19
의 표준 문서에 의해 설명 같습니다
불가분의 일정한 표현 만 리터 (2.13), 열거, CONST 변수 또는 상수 식 (8.5)으로 초기화 정수 또는 열거 타입의 정적 데이터 구성원을 포함 할 수 있으며, 비 형식 또는 열거 형의 -type 템플릿 매개 변수 및 sizeof 표현식. 부동 리터럴 (2.13.3)은 정수 또는 열거 형으로 형변환 된 경우에만 나타날 수 있습니다. 정수 또는 열거 유형에 대한 유형 변환 만 사용할 수 있습니다.
"정수"는 "정수"의 또 다른 용어이지만 "int"와는 다릅니다. 예를 들어 "char"은 정수/정수 유형이지만 int 유형은 아닙니다. 그래서 구체적으로, 다음은
- 물론
10 or 10L or anything like that
enum { THIS, OR, THAT };
int const this_one = 10;
sizeof(char)
- ,
위에 설명 된대로 다른 템플릿 매개 변수를 허용 사람들의 모든이 될 수 있습니다 정수 유형이 th 인 매개 변수의 템플릿 인수로 사용됩니다. e 해당 유형. 일부 전환은 여전히 적용됩니다. 따라서 int를 원하고 char을 전달하면 자동으로 char을 int로 승격합니다. 열거자를 제공하고 int를 원할 때도 마찬가지입니다. 그 규칙에 의해 그래서
, 당신은
extern const int SomeName;
을 가지고 그리고 그것은 중요한 상수 식으로 상수,이 템플릿 인수로 사용할 수 없습니다 초기화 정의를 표시하지 않는 경우. 물론 함수 인수로 사용할 수 있습니다. 그것들은 타입의 일부가 아니기 때문에 컴파일 타임에 알 필요가 없습니다. 순간 당신은 템플릿 특수화의 이름을, 당신은 유형의 일부가 사용되는 인수 :
이
MyGreatStack<int, 4> // 4 is now part of the type MyGreatStack<int, 4>!
참고 는 인수로 SomeName
을 전달하는 다른 방법이 있다는 것을. 그러나 모두 이 아닌 정수 템플릿 매개 변수로 허용되는 일 수 있습니다. 당신은 예를
template<const int& V> struct NowItWorks { };
를 들어, 참조 매개 변수에 의해 위의 내용을 받아 들일 수 그리고 위의 SomeName
을 받아 들일 것입니다. 이제는 값이 아니라 전체 프로그램에서 고유 한 특정 위치 (변수에 extern
연 결이 있음)가 선택되었습니다.