이번에는 클래스 템플릿을 보자.
template <typename T> class Array { private: T* elements; // 타입 T의 배열 size_t count; // 배열 원소의 개수 public: explicit Array(size_t arraySize); // 생성자 Array(const Array& other); // 복제 생성자 Array(Array&& other); // 이동 생성자 virtual ~Array(); // 소멸자 T& operator[](size_t index); // 첨자 연산자 const T& operator[](size_t index) const; // 첨자 연산자 - 상수 배열 Array& operator=(const Array& rhs); // 할당 연산자 Array& operator=(Array&& rhs); // 이동 할당 연산자 size_t size() { return count; } // count 변수를 위한 접근자 };
size_t 타입 별칭은 cstddef 헤더에 정의되어 있으며 비부호(unsigned) 정수 타입이다. 이 코드에서는 타입 T를 원소로 갖는 배열을 위한 템플릿을 간단하게 정의했다. 템플릿 정의 Array<T>에 쓰인 Array는 Array<T>를 의미하며, 원한다면 이런 식으로 코드를 작성할 수 있다. 템플릿의 본문 밖에 멤버 함수를 정의할 때는 반드시 Array<T>라고 써야 한다. 할당 연산자를 이용하면 Array<T> 객체 하나를 다른 객체에 할당할 수 있는데, 이는 원래 배열로 할 수 없는 작업이다. 이런 동작을 원하지 않을 때도 operator=() 함수를 템플릿 멤버로 선언해야 한다. 이렇게 하지 않으면 템플릿 인스턴스에 할당 연산자가 필요할 때 컴파일러가 기본 할당 연산자를 public으로 생성해버린다. 할당 연산자 사용을 금지하려면 delete로 지정해야 한다.
Array& operator=(const Array& rhs)=delete; // 할당 연산자 없음