2013-02-15 6 views
-2

"함수 선언에서 템플릿 키워드 사용"은 무엇을 의미합니까?함수 선언에서 template 키워드의 의미

오류가있는 컴파일러 오류 : "func"는 템플릿 함수가 아닙니다.

template<typename T> 
struct Window { 
    T value; 
}; 

template void func(Window<int>, int); 

template<typename T> 
void func(Window<T>, T) { 
} 

int main(void) { 
} 

하지만 아래의 예는 괜찮습니다.

template<typename T> 
struct Window { 
    T value; 
}; 

template<typename T> 
void func(Window<T>, T) { 
} 

template void func(Window<int>, int); 

int main(void) { 
} 

위의 경우 "템플릿"의 의미는 무엇입니까? 이 함수가 템플릿 함수임을 나타내는 지표입니까?

+1

이들은 모든 교과서 또는 자습서에서 찾을 수있는 기본 개념입니다. Google은 그 중 많은 사람들을 가리킬 수 있습니다. –

답변

0

키워드 template으로 시작하고 바로 뒤에 >< 뾰족한 중괄호가없는 선언을 명시 적 인스턴스라고합니다. 템플릿 정의를 검색하고 지정된 템플릿 매개 변수를 연결하여 특정 기능 전문화 또는 클래스 전문화를 얻는 것을 의미합니다. 첫 번째 예에서 컴파일러는 func이라는 템플릿에 대해 아직 모르기 때문에 func(Window<int>, int)을 인스턴스화 할 수 없다는 불만을 제기합니다.

템플릿은 암시 적으로 인스턴스화 할 수 있으므로 명시 적 인스턴스화는 일반적으로 필요하지 않습니다. 그러나 명시 적 인스턴스화는 관련 링커 심볼이 나타나는 위치와 방법을 일부 제어하며 경우에 따라 헤더 파일에서 템플릿 정의를 소스 파일로 이동하는 데 사용될 수 있습니다.

+0

답변 해 주셔서 감사합니다. 명시적인 인스턴스가 필요할 때 몇 가지 예를 들려 줄 수 있습니까? 당신은 어떤 상황에 댓글을 달았지만 이해할 수는 없습니다. –

+0

나는 이해했다. 템플릿 함수 또는 클래스가 별도의 소스 파일에있는 경우 명시 적 인스턴스화가 필요합니다. Tempate 인스턴스화는 호출 될 때만 발생합니다. http://msdn.microsoft.com/en-US/library/7k8twfx7(v=vs.80).aspx –

0

이것은 첫 번째 예에서이 선으로 나타내는 것 강제 인스턴스화 한 후 템플릿

template<typename T> 
void func(Window<T>, T) { 
} 

의 정의가해서 : 그들은 '두 번째 예 반면

template void func(Window<int>, int); 

을 돌아가는 길.

질문에 대한 의견은 공평합니다. 주제에 대한 철저한 연구를 통해 가장 잘 답변되는 기본적인 질문 ('템플릿 의미 란 무엇입니까')을 묻습니다.