2015-02-05 2 views
62

내가 선언 한 가정 :"템플릿 <>"대 "템플릿"대괄호없이 - 차이점은 무엇입니까?

template <typename T> void foo(T& t); 

이제

template <> void foo<int>(int& t); 

과 의미

template void foo<int>(int& t); 

의 차이점은 무엇입니까? 그리고 template-with-no-brackets와 template-with-empty-bracket은 다른 문맥에서 다른 의미를 가지고 있습니까?


관련 사항 :

template <typename T> struct foo {}; 

다음

가 전문입니다 클래스/구조체와 How do I force a particular instance of a C++ template to instantiate?

답변

55

template <> void foo<int>(int& t); 잠재적으로 다른 시체와 함께 전문화 템플릿의를 선언합니다.

template void foo<int>(int& t);템플릿의 명시 적 인스턴스화을 발생 시키지만 전문화는 도입하지 않습니다. 특정 유형의 템플릿을 인스턴스화합니다.

+2

매우 혼란 스럽습니다! 선언의 의미는 컴파일러가 특별한 정의가 발견되지 않을 때 특수 템플릿의 인스턴스화를 후보로 받아들이지 않는다는 것입니다. – einpoklum

+2

조금 더 설명하면 : 첫 번째 파일은 헤더 파일에 사용될 수 있으며 "foo "은'foo ' "과 다른 본문을 갖습니다. 프로그램의 다른 곳에서 코드가'foo ()'을 호출했지만 본문을 제공하지 않으면 alink 오류가 발생합니다. –

+3

두 번째 파일은 헤더 파일에 사용하면 안됩니다. 하나의 .cpp 파일에서 그것을 사용하면'foo '(전문화 라인이 없다면'foo '템플릿을 사용하여 템플릿을 생성합니다!)이 실제로 처리됩니다 (실제로는 * 정의 * -template 함수). 일반적으로 다른 코드가'foo '을 호출 할 때마다 이런 일을 할 필요는 없지만 [몇 가지 이유로] 할 수 있습니다 (http://stackoverflow.com/questions/2351148/explicit- 인스턴스화 - 그대로 - 사용) –

12

: 다음

template <> struct foo<int>{}; 

것은에서 명시 적입니다 stantiation는 :

template struct foo<int>; 
관련 문제