컴파일러는 클래스 템플릿을 템플릿이 생성한 타입을 갖는 객체로 인스턴스화한다. 다음 코드를 보자.
Array<int> data {40};
클래스 템플릿 타입 매개변수는 기본 인수가 아니면 인수를 항상 써야 한다. 이 코드가 컴파일될 때 세 가지 처리가 일어난다. 먼저 Array<int> 클래스를 위한 정의가 생성되고, 그에 따른 타입이 식별된다. 이어서 생성자 정의가 생성된다. 생성자는 객체를 생성할 때 반드시 호출되기 때문이다. 마지막으로 소멸자가 생성된다. 소멸자는 객체를 정리할 때 필요하기 때문이다. 컴파일러가 data 객체를 생성하고 정리할 때 필요한 것은 이게 전부이므로 템플릿에서 당장 생성해야 하는 코드도 이것뿐이다. 클래스 정의는 템플릿 정의에서 T를 int로 바꿔서 생성하면 되지만, 한 가지 미묘한 지점이 남아 있다. 컴파일러는 프로그램이 ‘사용’하는 멤버 함수를 컴파일만 할 뿐이므로 템플릿 매개변수의 인수를 바꾼 클래스 전체가 반드시 필요한 것은 아니다. data 객체의 정의만 본다면 클래스는 다음과 같이 정의된다.
class Array<int> { private: int* elements; size_t count; public: explicit Array(size_t arraySize); virtual ~Array(); };
여기서 볼 수 있는 멤버 함수는 생성자와 소멸자뿐이다. 컴파일러는 객체 생성에 필요 없는 나머지 부분은 인스턴스로 생성하지 않으며 프로그램에서 필요 없는 템플릿 부분도 포함하지 않는다.