강께르의 개발일지

[C++] 템플릿에 대해(클래스 템플릿) 본문

프로그래밍/C++

[C++] 템플릿에 대해(클래스 템플릿)

강께르 2021. 6. 18. 00:28

1. 클래스 템플릿

- 클래스 템플릿을 선언하는 방법은 함수 템플릿과 유사하다. 다음 코드를 보도록 하자.

template <typename T>
class Point
{
private:
    T xpos, ypos;
public:
    Point(T x = 0, T y = 0) : xpos(x), ypos(y) { }
    ...
}

- 함수 템플릿을 선언한 것처럼 함수 머리 위에 동일한 구문을 작성해준다. 멤버변수나 멤버 함수의 매개변수 중 필요한 곳에 어디든 T를 적용하고, 객체를 생성할 때 자료형을 명시해주면 된다.

Point<double> pos(2.4, 4.6);
Point<int> pos1(3, 4);

- 위와 같이 자료형에 맞는 템플릿 클래스를 통해 객체를 생성하는 모습이다. 이 경우 함수 템플릿과는 다르게 반드시 <>을 통한 자료형 명시를 해줘야 한다.

 

2. 클래스 템플릿의 선언과 정의의 분리

- 클래스 템플릿은 멤버 함수를 선언부에서 떼어서 클래스 외부에 정의하는 것이 가능하다. 다음 코드가 클래스의 선언부이다.

// 선언부
template <typename T>
class Point
{
private:
    T xpos, ypos;
public:
    Point(T x = 0, T y = 0) : xpos(x), ypos(y) { }
    T Func(const T& ref);
}

// 함수 정의
template <typename T>
T Point<T>::Func(const T& ref)
{ ... }

- Point 객체에 저런 함수가 필요하던가? 라는 의문은 여기서 접어두자. 설명을 위해서 임의의 함수를 넣어보았다.

- 이와 같이 선언부에서 떼어서 클래스 외부에 함수를 정의하는 모습이다. 이 때 유의할 점은 함수를 정의할 때, template<typename T>를 빼놓지 말아야 한다.

 

3. 파일 단위 컴파일 시 주의 사항

- 클래스 외부에 함수를 정의할 수 있다는 것은 파일 단위 컴파일에 이용할 수 있도록 선언부를 헤더에, 함수 정의를 cpp파일에 나눠 저장할 수 있을 것이다.

- 나눠 저장하고 main함수가 있는 cpp에 헤더파일을 include하고 컴파일을 하게 될 것이다. 그런데 컴파일러는 클래스 템플릿에 대한 정보가 부족하다고 한다. 왜 그럴까?

- 그것은 클래스 템플릿의 함수 정의가 cpp 파일로 있기 때문이다. 이것이 문제인가? 컴파일 시, 동시에 컴파일되는 것은 맞은데 cpp파일은 include하지 않은, 서로 다른 cpp파일에 대해 참조하지 않는다.

- 앞서 얘기했듯이 템플릿은 컴파일 시에 자료형에 따라서 함수를 만들거나, 클래스를 만든다고 했다. 그런데 해당 클래스 템플릿에 대한 정보를 온전히 알지 못하는 상태, 함수 정의를 알 수 없는 상태이기에 클래스 템플릿을 만들 수 없고 컴파일러는 그에 대한 정보가 부족하다고 하는 것이다.

- 그럼 어떻게 할까? 함수 정의를 선언부가 있는 헤더파일에 몰아 넣거나 필요한 cpp파일을 include하면 된다.

 

'프로그래밍 > C++' 카테고리의 다른 글

[C++] vector 템플릿 클래스  (0) 2021.06.18
[C++] STL에 대해  (0) 2021.06.18
[C++] 템플릿에 대해(함수 템플릿)  (0) 2021.06.17
[C++] 연산자 오버로딩에 대해_2  (0) 2021.06.17
[C++] friend 키워드  (0) 2021.06.16