IT Language 연습실
template 파일 분할. 본문
#include <iostream>
template <typename T>
class A {
T x; T y;
public :
A ( T n , T m) : x(n), y(m) { }
T show() { return x+y ; }
};
int main() {
A <int> aa(10, 20);
A <double> ab(1.1, 2.2);
std::cout<<aa.show();
}
다음의 코드를 파일 분할 원칙에 맞게 파일을 분할 하고자 한다 그래서 다음과 같이 파일을 분할했다면?
// class_template.h 헤더파일
#include <iostream>
template <typename T>
class A {
T x; T y;
public :
A ( T n , T m);
T show();
};
// class_template.cpp // 정의부분 소스파일
#include "class_template.h"
template <typename T>
A<T>::A ( T n , T m) : x(n), y(m) { }
template <typename T>
T A<T>::show() { return x+y ; }
// class_template_main.cpp //메인 파일
#include "class_template.h"
int main() {
A <int> aa(10, 20);
A <double> ab(1.1, 2.2);
std::cout<<aa.show();
}
위와 같이 말이다.
하지만 이는 컴파일 에러를 일으킨다.
컴파일 에러가 나는 이유는 템플릿은 일반 함수, 클래스와는 다르게 h파일에 선언된 선언부 말고도 cpp 소스파일에 정의된 정의부분까지 정보를 필요로하게 된다. 따라서 선언부와 정의부분의 정보 모두 필요로 하기 때문에 메인에서 헤더파일만 읽어올게 아니라 템플릿이 정의된 cpp 파일까지 읽어와야 한다.
아니면 h파일에 템플릿이 정의된 부분까지 한번에 넣어두도록 하자.
템플릿 컴파일 과정에서 정보가 부족하다는 이유는 ->
템플릿은 클래스나 함수를 자료형에 맞게 사용하기 위해서 사용자가 임의로 정의한 것이지 않은가?
그렇다면 컴파일은 헤더 부분만 읽어왔다면 자료형에 맞게 사용할 수 있게 하기 위해서는 당연히 정의부분도 알아야 한다.
그런데 정의부분이 생략된다면 어떤 자료형이 왔는데 그 자료형에 맞게 처리하게 하기 위해서는 부족하다는 것.
또한 함수 오버로딩이나 함수 오버라이딩을 하는 과정에서도 자료형이 명확해야 하는데 템플릿은 자료형이 없다.
명확하지 않다.
그래서 정보가 부족하다는 것. 정의부분을 꼭 알고 있어야 한다는 것
일반함수나 일반 클래스가 되는 것도 자료형 부분이 명확했기 때문이다.
따라서 방법은 두가지라는 뜻이다.
#include "class_template.h"
#include "class_template.cpp"
int main() {
A <int> aa(10, 20);
A <double> ab(1.1, 2.2);
std::cout<<aa.show();
}
메인부분에서 class_template.cpp 이라는 파일을 불러오던지.
// class_template.h 헤더파일
#include <iostream>
template <typename T>
class A {
T x; T y;
public :
A ( T n , T m);
T show();
};
template <typename T>
A<T>::A ( T n , T m) : x(n), y(m) { }
template <typename T>
T A<T>::show() { return x+y ; }
헤더파일에 한번에 정의를 하던지.
둘중 하나로 선택해서 사용하면 된다. 이말이다.
'C++' 카테고리의 다른 글
template (4) 클래스 ver (0) | 2024.02.23 |
---|---|
스마트 포인터 (Smart Pointer) (0) | 2024.02.22 |
template (3) 클래스 ver (0) | 2024.02.22 |
template (2) 함수 ver (0) | 2024.02.21 |
template (1) 함수 ver (0) | 2024.02.21 |