1. 클래스 템플릿(class template)이란,


2. C++ 클래스 템플릿 정의

template <typename 타입이름>

class 클래스템플릿이름
{
    // 클래스 멤버의 선언
}

/* 
 함수 템플릿과 마찬가지로 템플릿 정의 내에서 typename 키워드 
대신에 class 키워드를 사용할 수 있다.
 위에서 정의된 타입 이름은 클래스의 선언에서 임의의 타입으로
사용할 수 있다.
*/

3. 클래스 템플릿 예제(Data 클래스)

template <typename T>

class Data
{
public:
    Data(T dt);
    data(T dt);
    T get_data();

private:
    T data_;
};

/* 실행 결과
str_data : C++ 수업
int_data : 12
*/

/*
 위처럼 클래스 템플릿으로부터 객체를 생성할 때에는 꺾쇠괄호(<>) 안에 
템플릿에 전달된 인수 타입을 명시해야 합니다.
 전달된 매개변수의 타입을 가지고 컴파일러가 해당 타입에 맞는 
함수를 생성해 주는 함수 템플릿과는 달리, 클래스 템플릿은 
사용자가 사용하고자 하는 타입을 명시적으로 제공해야 합니다.
*/

4. 클래스 템플릿의 특징

  1. 하나 이상의 템플릿 인수를 가지는 클래스 템플릿을 선언할 수 있다.
template <typename T, int i> 
// 두 개의 템플릿 인수를 가지는 클래스 템플릿을 선언함.

class X
{ ... };
  1. 클래스 템플릿에 디폴트 템플릿 인수를 명시할 수 있다.
template <typename T = int, int i> 
// 디폴트 템플릿 인수의 타입을 int형으로 명시함.

class X
{ ... };
  1. 클래스 템플릿을 기초 클래스로 하여 상속할 수 있다.
template <typename Type>

class Y : public X <Type> // 클래스 템플릿 X를 상속받음.
{ ... };