템플릿 클래스 작성시 질문입니다

조회수 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 에 템플릿 클래스를 정의하고 사용할 수 있게 되었습니다. 하지만 이 경우 템플릿 인자 별로 모두 작성해야하기 때문에 제한 적인면이 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)