을 감안할 때 :초기화 프로그램이있는 정적 const 멤버에 사용할 수있는 정의가 없습니다?
template<class T>
struct S {
static int const N = 1;
};
extern template class S<int>;
template<class T>
int f(T n) {
return n + S<T>::N; // line 10
}
int main() {
return f(1); // line 14
}
//template class S<int>; // intentionally commented out to trigger error
내가 얻을 :
foo.cpp: In function ‘int f(T) [with T = int]’:
foo.cpp:10: instantiated from ‘const int S<int>::N’
foo.cpp:10: instantiated from ‘int f(T) [with T = int]’
foo.cpp:14: instantiated from here
foo.cpp:10: error: explicit instantiation of ‘S<int>::N’ but no definition available
그러나 가 왜 오류를받을 수 있나요? 정의가 다른 할 수 있도록
는- 명시 적 템플릿 인스턴스화 선언을하는 요점은, 아직 컴파일러 (안 링커) 오류를 제공합니다. (실제 응용 프로그램에서는 현재 주석 처리 된 인스턴스화 선언이 어쨌든 다른 번역 단위에 있습니다.)
- 이 경우 값은 상수 이니셜 라이저이므로 컴파일러는 이론상 단순히 값을 직접 사용할 수 있습니다.
- 명시 적 템플릿 인스턴스화 선언을 수행하지 않을 때 나는 (기묘하게)
S<T>::N
을 명시 적으로 정의 할 필요가 없습니다.
Mac OS X 10.6.6의 g ++ 4.2.1입니다.
'static const' 대신'enum {N = 1};을 사용할 수 있습니다. – kennytm
@KennyTM : 그 질문에 대답하지 않습니다. 분명히,이 예제는 실제 코드의 예제입니다. 실제 코드는 ~ 0으로 설정된 부호없는 long을 필요로하며, AFAIK, enum은 "unsigned"일 수 없습니다. –
이건 그냥 컴파일러 버그라고 생각합니다. m ++에서 g ++ 4.4.0으로 잘 컴파일됩니다. – TonyK