class Point
{
private:
int xpos, ypos;
public:
Point(int x = 0, int y = 0) : xpos(x), ypos(y)
{ }
void ShowPosition() const
{
cout << "[" << xpos << " , " << ypos << "]" << endl;
}
}
template <typename T>
class Point
{
private:
T xpos, ypos;
public:
Point(T x = 0, T y = 0) : xpos(x), ypos(y)
{ }
void ShowPosition() const
{
cout << "[" << xpos << " , " << ypos << "]" << endl;
}
}
템플릿 클래스의 생성은 컴파일러에 의해 객체 생성시 일어난다.
템플릿 클래스의 객체 생성 시 자료형의 생략은 불가능하다.
int main()
{
Point<int> pos1(1, 4); //Point<int> 클래스 생성 후 객체 생성
Point<double> pos2(2.1, 4.6); //Point<double> 클래스 생성 후 객체 생성
}
클래스의 선언부 -> .h에 작성
클래스의 정의부 -> .cpp에 작성
위와 같이 분리해서 작성하는 경우가 많다.
위와 같은 template이 헤더파일에 선언되어 있다고 하자
이 클래스의 정의를 .cpp에 작성할 때
SimpleTemplate::SimpleFunc( .... )
-> X
- SimpleClass는 클래스가 아닌 템플릿 이기 때문에 잘못된 정의이다.
SimpleTemplate<T>::SimpleFunc( .... )
-> O
- SimpleTemplate<T> 라는 클래스의 멤버함수 정의
함수 정의마다 template <typename T>로 T가 무엇인지 알려줘야 한다.
SimpleTemplate.h
SimpleTemplate.cpp 와 main.cpp에 복사된다.
SimpleTemplate.cpp
템플릿 타입인 T만 정의되어있어 메모리 할당을 얼마나 할지 알수 없다.
따라서 함수 몸체부분의 메모리 할당이 정의되지 않고 넘아가게 된다.
main.cpp
객체생성으로 템플릿 클래스가 생성된다.
하지만 멤버함수를 호출할 경우 SimpleTemplate.cpp에서 메모리 할당이 정의되지 않았으므로 링킹에러가 난다.
#include "SimpleClass.cpp"
도 추가한다.