2013-03-19 5 views
0

다음 코드를 사용하면 두 번째 foo이 부분 전문화로 간주되는 이유는 다소 혼란 스럽지만 (IMO는 모두 부분이이 아니어야 함). 두 번째 foo GCC에왜 부분적으로 전문화 된 것으로 간주 되는가

template <bool IS_TRUE> 
int foo(); 

// Doesn't work!? 
template <bool IS_TRUE> 
int foo<IS_TRUE>() { 
    return 0; 
} 

template <> 
int foo<true>() { 
    return 0; 
} 

int main() { 
    return foo<true>(); 
} 

불평 :

error: function template partial specialization ‘foo’ is not allowed

누군가가 설명해 주시겠습니까, 내가 놓친 거지 자세한 것을.

+0

'부분적으로) 부분적으로 전문화 된 것처럼 보이기 때문에 (클래스는 그것을 가질 수 있음을 기억하라.) 그리고 함수 템플릿은 부분적인 전문화를 가질 수 없기 때문에 ... – Xeo

+0

정말요? 이 2 개의 정의는 나에게 꽤 다른 것처럼 보입니다. 사양에 대한 링크가 있습니까? – abergmeier

+0

'§14.5/1' : "* template-id *, 즉 * template-name * 다음에 * template-argument-list *가 기본 템플릿 선언의 선언에 지정되어서는 안됩니다." – Xeo

답변

0

템플릿 인수 구문 이름이 부분 특수화를 위해 예약 한 후 :

template<typename T> struct foo {}; 
template<typename T> struct foo<T *> {}; 

부분 전문화 인수를 전문으로하는 데 실패하면 당신은 얻을 것이다이 같은 오류 :

template<typename T> struct foo {}; 
template<typename T> struct foo<T> {}; 
error: partial specialization 'foo<T>' does not specialize any template arguments 

함수 템플릿에 부분 전문화가 허용되지 않습니다 (대신 오버로드 사용). 따라서 전문화가 실제로 템플릿 인수를 전문으로하는지 여부를 컴파일러가 확인하지 않습니다. 어쨌든 그것은 불법입니다. 당신은 함수의 선언과 정의를 분리하는 경우, 당신은 선언과 정의 모두 템플릿 인수를 생략해야합니다

주된 템플릿 정의 템플릿 인수 목록 (은` 을 할 수 없습니다
template<bool IS_TRUE> int foo(); 
template<bool IS_TRUE> int foo() { return 0; } 
template<> int foo<true>() { return 0; } 
관련 문제