C++(따라하며 배우는 C++)

Chapter 13 - (1). 템플릿 Template

void_melody 2021. 11. 7. 17:17

함수의 형태는 동일한데, 자료형이 계속 달라서 저렇게 함수들을 일일이 만드는 것은 노가다에 불과하다...

모든 자료형에 적용되는 것이 없을까? 해서 나온게 Template 이다.

template<typename "이름">으로 주로쓴다.

template<class "이름">을 써도 같은 동작을 한다.

클래스의 객체를 활용하려면, 연산자를 오버로딩해줘야한다.

_____________________________________________________________________________________________________________________________

현재 m_data 동적배열에 아무 자료형을 넣기 위해 T로 해주었다. operator [] 의 경우 return type 역시 아무자료형이 나와야하므로 T로 해줬다.

이 경우, 내가 어떤 자료형을 쓸 것인지(인수)를 명시해줘야겠지.  

옆에 <자료형> 을 붙여주면된다.

만약 헤더파일 안의 저 print()함수를 클래스 밖으로 빼고 싶다면 저렇게 마찬가지로 < > 를 통해 인자를 명시해줘야한다. 이 인자를 명시해줘야한다 때문에 생기는 문제가 있다. 

(설명)

내가 새로 CPP 파일을 만들어서 해당 print()함수를 넣어줬다.

난 분명히 헤더파일을 include해줬기 때문에 문제가 없어보인다.

하지만, main 함수에서 <double>이라는 자료형을 명시해줬지만, main 함수는 MyArray헤더파일을 include해줬을 뿐,

MyArray Cpp파일은 include를 안해줘서 MyArray.cpp의 print()함수는 자료형 인수가 무엇인지 명시가 안되어 오류가

난다.

해결책은 ?

1. main파일에 MyArray.cpp를 include해준다. 

-> 하지만 좋은 방법은 아님. 그러면 cpp 생길때마다 계속 include를 해주면 난리나잖아.

2. MyArray.cpp파일 안에 T가 main함수에는 어떤 자료형이다를 명시해주면 되니까

template class MyArray<char>; // 이건 MyArray클래스가 char을 자료형인자로 받았다로 명시

template void MyArray<double>::print(); // 이건 MyArray클래스가 double로 받았고 이를 print()에서 사용한다.

Template가 만능이긴 하지만, 자료형을 명시해주는 것 중요하다!