공부/C || C++

C++ 템플릿 클래스/함수 헤더파일에 선언과 정의 모두 해줘야 하는 이유

sudo 2021. 7. 23. 23:40

Visual studio에서 클래스를 템플릿 클래스로 구현하기 위해서는 추가 > 클래스로 들어가서 아래 그림처럼 인라인이 되게, cpp파일 없이 헤더파일의 클래스 선언부분에 정의까지 해주는게 좋다.

템플릿 클래스(혹은 함수)를 헤더파일과 cpp파일로 다른 일반 클래스(함수)과 똑같은 방법으로 나눠서 선언, 구현을 따로 작성하면 오류가 뜬다.

// Template.h

#pragma once

template <typename T>
class CTemplate
{
public:
	CTemplate();
	~CTemplate();

	void Output(T t);
};
// Template.cpp

#include "Template.h"


template<typename T>
CTemplate<T>::CTemplate()
{
}

template<typename T>
CTemplate<T>::~CTemplate()
{
}

template<typename T>
void CTemplate<T>::Output(T t)
{
}
// main.cpp

#include <iostream>
#include "Template.h"

int main()
{
	CTemplate<int> ct;

	return 0;
}

이유는 stackoverflow에 친절히 설명된 답변을 찾을 수 있었다.

https://stackoverflow.com/questions/5612791/c-template-and-header-files

해석하면 template 클래스(혹은 함수)는 컴파일 타임에 인스턴스화되는데(링크 타임이 아니라), cpp파일은 link-time에 다른 cpp파일들을 인지할 수 있다. 헤더파일은 #include 덕분에 컴파일타임에 알려지게 된다. 그래서 헤더파일에 선언과 구현이 모두 있어야 하는것이다.

 

템플릿 클래스(혹은 함수)를 헤더파일과 cpp파일로 나눠서 선언, 구현을 따로 작성하려면 할 수는 있다. 템플릿 클래스를 사용하는 파일(위의 나의 코드 예시에선 main.cpp)에서 템플릿 클래스가 구현된 Template.cpp파일을 include해주면 된다.