언어/C
[C] 템플릿 함수를 헤더에 정의해야하는 이유
program-yam
2025. 5. 29. 11:59
✅ c++ 템플릿의 컴파일 원리
템플릿은 컴파일 타임에 인스턴스화된다.
c++ 에서 템플릿은 실제로 사용되기 전까지 코드가 생성되지 않는다. 템플릿 함수나 클래스는 일종의 코드 생성기로,
특정 타입이 주어졌을 때 컴파일러가 해당 타입에 맞는 코드를 만들어낸다.
예를 들어
template<typename T>
T add(T a, T b)
{
return a + b;
}
add<int>(1, 2)가 호출될 때, int를 타입으로 가지는 add<int>라는 함수가 생성된다.
✅ 헤더에 정의하지 않으면 생기는 문제
만약 위 템플릿을 .cpp 파일에 정의하고, 헤더에는 선언만 해두면 아래와 같은 문제가 발생한다.
❗ 컴파일러가 템플릿 정의를 찾을 수 없음
- 컴파일러는 어떤 타입으로 인스턴스화할지 알 수 없다.
- 컴파일러가 .cpp 파일을 보지 않고 템플릿의 정의 전체를 알아야 해당 타입에 맞는 코드를 생성할 수 있기 때문
결과적으로 링커 에러가 발생한다.
undefined reference to 'int add<int>(int, int)'
✅ 해결 방법: 정의를 헤더에 포함
템플릿은 정의와 선언을 한 파일( 주로 헤더 )에 함께 작성해야 아래와 같이 동작한다.
- 헤더는 cpp 파일에서 #include 되기 때문에 정의가 항상 접근이 가능
- 컴파일러는 그 자리에서 템플릿 인스턴스를 직접 생성할 수 있다.
// add.h
template<typename T>
T add(T a, T b) {
return a + b;
}
헤더에 선언과 정의를 동시에 구현
#include"add.h"
int result = add<int>(3, 4);
위처럼 add함수를 호출하는 순간 컴파일러가 add<int>를 생성한다.