템플릿 클래스 작성시 질문입니다
조회수 909회
// TestClass.h
template <typename T>
class TestClass
{
TestClass();
}
// TestClass.cpp
#include <TestClass.h>
template <typename T>
TestClass<T>::TestClass()
{
}
이런식으로 템플릿 클래스를 헤더파일과 소스파일 나눠서 구현하려는데 에러가 나옵니다.. 템플릿 클래스는 이런식으로 따로 구현이 불가능한가요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
본론부터 말하자면 클래스 템프릿의 구현은 헤더 파일에 작성하는 것이 권장됩니다.
클래스 템플릿은 타입이 아니기에 템플릿 인자를 입력하여 인스턴스화 시켜 사용합니다. 이렇게 인스턴스화된 타입을 템플릿 클래스라고 합니다.
TestClass<int> t;
예를 들어 위의 코드에서
TestClass
는 클래스 템플릿이며,TestClass<int>
는 템플릿을 인스턴스화한 템플릿 클래스이며,t
는 이 템플릿 클래스의 인스턴스이자 변수이름 입니다.클래스 템플릿을 인스턴스화 할 때 컴파일러는 템플릿으로 작성된 내용중 템플릿 파라미터(질문의 경우
T
)를 입력된 템플릿 인자로 치환하는 과정을 거치게 됩니다. 치환을 위해서는 당연히 템플릿 내용을 알고 있어야 합니다. 따라서 클래스 템플릿이 인스턴스화 되는 위치 앞에 클래스 템플릿을 정의하는 코드가 존재해야합니다.이 말은 템플릿 정의가 꼭 헤더 파일에 존재해야 한다는 의미는 아닙니다. 템플릿이 인스턴스화 되는 cpp 파일에서 전처리 과정을 거친 결과 상에서 템플릿의 정의를 알 수 가 있어야 된다는 의미입니다. 그렇기에 템플릿 정의가 다른 cpp 파일에 존재하게 되면 템플릿을 인스턴스화하는 cpp 파일 에서 해당 내용을 알 수 없기에 오류가 발생합니다.
C++11 부터는 extern template 을 통해 다른 cpp 에 템플릿 클래스를 정의하고 사용할 수 있게 되었습니다. 하지만 이 경우 템플릿 인자 별로 모두 작성해야하기 때문에 제한 적인면이 있습니다.
댓글 입력