본문 바로가기
Programing General/C \ C++

[C++] template class 템플릿 클래스 파일 분할

by Gnaseel 2020. 5. 20.
728x90
반응형

템플릿 클래스의 파일 분할은 일반적인 클래스의 파일 분할과는 방법이 다르다.

우선 직접적인 구현 이전에 왜 템플릿 클래스는 일반적인 클래스처럼 파일을 헤더파일과 소스파일(cpp)로 분할할 수 없는지 알아보자.

 

왜 오류가 나는가?

 

 템플릿 클래스를 헤더파일에서 선언하고, cpp파일에서 구현한다면 다음과 같은 링크 오류를 만나게 된다.

 

일반 함수와는 다르게 템플릿은 컴파일 시점에 인스턴스가 생성되어야 한다.

왜냐하면 일반 함수는 컴파일 시점에 정의를 볼 수 없어도, 함수가 호출 되면 어떤 함수가 호출되었는지 링킹 과정에서 파악할 수 있다. 하지만 템플릿은 호출 될 때마다 그 정의를 확인해야 정확한 코드를 작성할 수 있다.

즉, 사용되는 개별 번역단위(translation unit)마다 그 정의를 포함시켜줘야 하는 것이다.

만약 A라는 클래스 템플릿의 헤더파일을 만들고, cpp파일을 만들어 정의 한다면 이와는 개별 번역단위인 main cpp파일에서는 링크 과정에서 A의 인스턴스를 생성할 때 그 정의를 확인할 수 없어 오류가 발생하는 것이다.

 

그렇다면 어떻게 해결해야 하는가?

 

개별 번역단위마다 정의를 포함시키면 된다.

 

그래서 주로 사용되는 방법은 헤더파일에 정의를 포함시키는 것이다.

헤더파일에 선언과 정의를 모두 포함시키면, 해당 클래스의 헤더파일을 전처리기로 불러올 때 템플릿에 대한 구현까지 모두 포함해서 불러들이기 때문에 오류가 날 수 없다.

 

이를 위해 hpp라는 확장자를 제공하는데, 구현을 위한 헤더파일이다. 컴파일러는 헤더파일로 받아들이지만, 사용자는 마치 cpp파일처럼 템플릿에 대한 구현을 담사 사용하는 것 이다.

사용법은 약간 다른데,  hpp파일에 템플릿을 구현한 후, h 파일의 맨 끝에서 include로 hpp파일을 불러오면 된다.

반응형