내가 선언 한 가정 :"템플릿 <>"대 "템플릿"대괄호없이 - 차이점은 무엇입니까?
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?
매우 혼란 스럽습니다! 선언의 의미는 컴파일러가 특별한 정의가 발견되지 않을 때 특수 템플릿의 인스턴스화를 후보로 받아들이지 않는다는 것입니다. – einpoklum
조금 더 설명하면 : 첫 번째 파일은 헤더 파일에 사용될 수 있으며 "foo"은'foo ' "과 다른 본문을 갖습니다. 프로그램의 다른 곳에서 코드가'foo ()'을 호출했지만 본문을 제공하지 않으면 alink 오류가 발생합니다. –
두 번째 파일은 헤더 파일에 사용하면 안됩니다. 하나의 .cpp 파일에서 그것을 사용하면'foo'(전문화 라인이 없다면'foo '템플릿을 사용하여 템플릿을 생성합니다!)이 실제로 처리됩니다 (실제로는 * 정의 * -template 함수). 일반적으로 다른 코드가'foo '을 호출 할 때마다 이런 일을 할 필요는 없지만 [몇 가지 이유로] 할 수 있습니다 (http://stackoverflow.com/questions/2351148/explicit- 인스턴스화 - 그대로 - 사용) –