2009-09-12 5 views
20

다음 템플릿 특수화 코드 :C++ 템플릿 특수화 : "명시 적 템플릿 인수의 불법 사용"

template<typename T1, typename T2> 
void spec1() 
{ 

} 

테스트 케이스 1 :

template< typename T1> //compile error 
void spec1<int>() 
{ 

} 

테스트 케이스 2 :

template< typename T2> //compile error 
void spec1<int>() 
{ 

} 

은 다음 컴파일 오류를 생성합니다.

error C2768: 'spec1' : illegal use of explicit template arguments

이유를 아는 사람이 있습니까?

+0

어떤 플랫폼/컴파일러를 사용하고 있습니까? – aaa90210

+0

Visual C++ 08을 사용하고 있습니다. – jameszhao00

답변

51

기능 템플릿 그런 즉, 단지 완전히, 부분적으로 전문화 할 수 없습니다 : 함수 템플릿을 부분적으로 전문화 할 수없는 이유, 당신이 read this 할 수 있습니다 들어

template<> 
void spec1<char, int>() 
{ 

} 

.

당신이 부분적으로 (클래스에서만 가능) 전문, 당신은 그런 식으로 그것을해야 할 것 :

template <typename T1> 
class class1<T1, int> 
{ 

}; 

그래서 다시 T1를 나열해야합니다.

전문화 방법은 spec1<int, int>에 대해 모호합니다.

+3

아, 정적 함수가 포함 된 부분적으로 특수화 된 클래스를 가질 수 있습니까? – jameszhao00

+0

아, 링크 된 기사에서 이미 문제를 설명합니다. 내 대답을 삭제했다. 클래스로 전달하는 것이이 경우에 더 편리하다는 것을 알았 기 때문이다. 함수 매개 변수의 타입으로 'T1'과 'T2'가 사용되는 경우, 나는 정상적인 함수 오버로딩과 마찬가지로 오버로드가 훨씬 더 읽기 쉽다는 것을 알게된다. –

+0

"수업에만 가능"이라고 읽었을 때 나는 괴롭혔다. 클래스와 구조체 모두에서 가능하다는 것을 알았습니다 ;-). –

관련 문제