아니요, 일반 기능과 다릅니다. bar.cc
으로, 이러한 기능을 사용하는 모든 소스 파일의 헤더를 인클루드하고, foo.cc
로, 같은를 등을 정기적 기능으로, 당신은 헤더에
void foo(int);
void foo(double);
를 선언 할 수있는 몇 가지 소스 파일에서 함수를 정의, 링커가 나머지를하도록하십시오. 컴파일러는 bar.cc
을 컴파일하고 bar.o
을 생성합니다. 어딘가에 함수를 정의했는지 확인하고, 그렇지 않은 경우 링크 타임 오류가 발생합니다.
그러나 템플릿 사용하는 경우 : 그것이 어떻게 작동하는지 상상하는
template <typename T>
void foo(T) ...
시도. foo.cc
과 bar.cc
소스 파일은 독립적이며 서로에 대해 알지 못한다. 단 두 가지 헤더에있는 내용에 모두 동의한다는 점만 제외하면 #include (전체 아이디어)입니다. 따라서 bar.cc
은 foo.cc
이 어떻게 구현되는지 알지 못하며, foo.cc
은 이러한 기능으로 어떤 것이 수행 될지 알 수 없습니다. 이 시나리오에서 foo.cc
은 을 알지 못합니다. bar.cc
은 T으로 지정할 것입니다. 그렇다면 foo.cc
에는 태양 아래 모든 typename에 대한 정의가 어떻게 있습니까?
이렇게 할 수 없으므로이 방법은 허용되지 않습니다. 컴파일러가 foo(int)
또는 foo(string)
또는 또는 bar.cc
이 무엇이든간에 정의를 작성할 수 있도록 헤더에 전체 템플릿이 있어야하며이 템플릿을 bar.o
에 빌드해야합니다 (또는 템플릿이 의미가없는 경우 불평합니다). 유형).
클래스에 대해서도 마찬가지입니다.
규칙은 템플릿 전문화와 약간 다르지만 고급 기법을 시도하기 전에 기본 사항을 잘 이해해야합니다.
http://stackoverflow.com/questions/3368883/how-does-this-size-of-array-template-function-work 정의가 실제로 필요하지 않은 템플릿 프로토 타입의 예를 보여줍니다. 그래서 링커는 불평하지 않습니다. – QuentinUK