Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- schema first
- 도커
- 어셈블리어
- 스타트업
- uuid-ossp
- 자료구조
- mistel키보드
- 42seoul
- enable_if
- 창업
- 어셈블리
- raycasting
- 정렬
- 스플릿키보드
- 쿠버네티스
- 이노베이션아카데미
- Cloud Spanner
- 프라이빗클라우드
- c++
- 텍스트북
- 동료학습
- psql extension
- 엣지컴퓨팅
- GraphQL
- 파이썬
- 레이캐스팅
- adminbro
- SFINAE
- 42서울
- 부동소수점
Archives
- Today
- Total
written by yechoi
[C++] 템플릿을 헤더(hpp)에 정의해야 하는 이유는? 본문
반응형
* 본 글은 아래의 문서를 정리했습니다.
먼저 알아둬야 할 사실은 다음과 같다.
- 템플릿은 클래스도 함수도 아니다. 클래스, 함수 패밀리를 생성하기 위해 컴파일러가 사용하는 "패턴"이다.
- 컴파일러가 코드를 생성하기 위해선, 컴파일러는 템플릿의 선언뿐만 아니라 정의를 볼 수 있어야 하며 템플릿을 구성하는 타입 등을 알 수 있어야 한다. 예를 들어
Foo<int>
를 사용하려고 한다면, 컴파일러는 Foo 템플릿 뿐만 아니라 당신이Foo<int>
를 만들려고 한다는 사실 또한 알아야 한다. - 컴파일러는 cpp 파일을 컴파일 하는 동안 각각의 cpp 파일의 내용을 기억하고 있지 않는다. 이러한 방식의 컴파일을 "separate compilation model"이라고 부른다.
이러한 사실을 바탕으로, 왜 이러한 방식으로 작동하는지 보여줄 예시가 있다. 아래처럼 정의된 Foo 템플릿이 있다고 하자.
template<typename T>
class Foo {
public:
Foo();
void someMethod(T x);
private:
T x;
};
멤버 함수 정의는 다음과 같다.
template<typename T>
Foo<T>::Foo()
{
// ...
}
template<typename T>
void Foo<T>::someMethod(T x)
{
// ...
}
Bar.cpp 파일에서 Foo를 사용한다고 해보자.
// Bar.cpp
void blah_blah_blah()
{
// ...
Foo<int> f;
f.someMethod(5);
// ...
}
일단 생성자와 someMethod()
함수를 위해선 "패턴"을 사용해야 하고, T
가 실은 int
인 경우 인스턴스화해야 한다. 만약에 생성자와 someMethod()
함수를 Foo.cpp
에 넣어두면, 컴파일러는 템플릿 코드를 Foo.cpp
를 컴파일 할 때 볼것이고 Bar.cpp
를 컴파일 할때 Foo<int>
를 발견할 것이다. 그런데 이 두가지가 동시에 일어날 순 없다. 따라서 위 2번 항목에 따르면, Foo<int>::someMethod()
를 절대 생성할 수 없을 것이다.
전문가들을 위한 노트: 위 내용은 심히 간략히 설명한 것이다. 의도적인 부분이니 크게 문제 삼지 말길.
반응형