보통 클래스 선언은 .hpp파일에, 구현은 .cpp파일에 작성할 것이다.
하지만 template 클래스를 일반 클래스처럼 나눠서 구현하게 된다면 symbol을 찾을 수 없다며 컴파일 에러가 발생한다.
template 클래스(or 함수)는 컴파일 타임에 사용되는 타입으로 인스턴스화 된다. .cpp파일들은 include한 header파일들을 컴파일 타임에 합쳐 template클래스의 선언만 인지할 수 있게되고, 컴파일 뒤 링킹 타임에 다른 .cpp파일들은 인지할 수 있기 때문에 컴파일 시에는 template의 구현 부분이 존재하지 않아 인스턴스화를 진행할 수 없게 된다.
때문에 헤더 파일에 선언과 구현이 모두 존재해야 컴파일 타임에 template클래스와 함수를 문제없이 인스턴스화할 수 있게된다.
선언과 구현을 따로 하는 경우
선언과 구현을 함께 하는 경우
선언과 구현을 따로 하기 위해서는 구현한 .cpp파일(다른 확장자여도 된다)를 헤더 파일 아래에 include해주면 된다. (구현한 파일 내부에는 헤더 파일을 include하면 안된다!)