반응형

template

  • 템플릿 매개 변수에 대해 제공하는 인수를 기반으로 컴파일 시간에 일반 형식 또는 함수를 생성하는 구문

  • 함수 또는 클래스에 사용되는 자료형이, 특정 자료형에 의존하지 않게 할때 쓰임 ( Generic Programming )

  • 여러가지 자료형에 대해서 비슷한 코드를 반복해서 작성하는 것을 방지해줌

 

 

함수 템플릿

"template <typename T>" 또는 "template<class T>" 함수위에 한줄 작성, 여기서 T 자료형으로 매크로(#define)처럼 치환될 타입이름, 아직 정해지지 않은 타입이름이다, 많이 쓰이는 이름으로 T 쓰인다, T 쓰지 않고, T1, T2 등으로 써도 컴파일된다. 

T 매개변수의 타입으로도 쓰일수 있고, 함수 스코프 안에서 자유롭게 T 사용할 있다

T 함수 호출할때 , 함수이름<자료형>(); 이런식으로 미리 정해서 호출할 수도 있고

정하지 않고도 81번라인~ 85번라인의 코드처럼 함수를 호출 해도 템플릿 코드가 동작한다.

74 라인의 경우, OutputType<int>(); T int 치환된것이다

int, float 말고도 사용자 정의 자료형(class) 들어갈 있다.

 

주의

사용자 정의 자료형을 함수 템플릿의 T 쓸때 주의할 점은 함수 안에서 비교, 산술 등등의 연산자를 사용하는 경우 사용자 정의한 클래스에 연산자 오버로딩이 되있어야 한다.

그렇지 않을 경우 error C2676 발생 한다

error C2676 이란? https://docs.microsoft.com/ko-kr/cpp/error-messages/compiler-errors-2/compiler-error-c2676?view=vs-2019

 

IsSame 실행 있게 MyClass == 연산자 오버로딩을 해주고, int 멤버 변수를 만든뒤, 생성자로 기본값을 설정해야 선언 있게 만들었다

정상 작동하는걸 있다, template 함수에 내가 만든 클래스형을 인자로 호출 할때는 함수 안에서 연산자를 쓰는지 여부를 파악해야 하며, 연산자를 쓴다면 연산자 오버로딩이 필요하다.

 

 

 

또한 위처럼 typename 여러 있다.

 

 

클래스 템플릿

클래스를 디자인할때 템플릿을 사용할 있다,

클래스 선언시에 클래스옆에<자료형> 붙여서

어떤 자료형이 오게 될지를 먼저 정해줘야 한다.(Template은 컴파일 시간에 동작하기 때문에)

 

또한 템플릿 클래스의 메소드(멤버 함수)들은 T 자유롭게 사용할 있다.

tem2 T float 정해졌기 때문에 tem2 메소드 Output2 인자로 float 요구하는 있다.

 

 

주의

template 클래스에서는 위와 같이 헤더파일과 .cpp 파일 분리를 해도, 원활한 분리가 되지 않는다.

빌드를 하면 아래와 같은 링크 에러가 발생한다.

error LNK2019 가   발생했다 .

 

 

원인

헤더 파일을 .cpp 파일에 include 하게 되면 헤더파일의 내용을 cpp 파일의 맨앞부터 복사 해서 붙여놓은 것과 같다, 컴파일은 .cpp파일에서 하게 되어있다. 필요한 함수 또는 변수 선언이 있다면 헤더파일에서 찾는것이다.

그래서 Template_2_main.cpp 파일의 경우 6번라인에 있는 클래스 CTemplate "CTemplate.h" 파일에서 찾은뒤 T int 치환해서 instance 생성한다

문제는 Output 함수의 body 컴파일 할때는 CTemplate.cpp에서 컴파일을 하는데

CTemplate.h include CTemplate.cpp 파일의 경우 main 함수에서 int T 정했다는 수가 없다. CTemplate.cpp T 쓰는함수들은 여전히 동일하게 T인것이다.

그래서 Output 함수를 컴파일 할때 T int 치환을 안하게 된다

 

해결책

explicit instantiation

CTemplate.cpp 파일에 위와 같이 explicit instantiation(명시적 인스턴스화) 해주면 된다.

 

explicit instantiation 하는법

 

template 클래스이름<특정자료형>::함수이름(특정자료형 매개변수이름) ;

 

반응형

'C++' 카테고리의 다른 글

string vs stringstream  (0) 2020.09.04
template singleton  (0) 2020.07.21
c++ typeid 연산자  (0) 2020.03.16
References(L-value reference, R-value reference)  (0) 2020.03.13
C++ lvalue, rvalue, xvalue, glvalue, prvalue  (0) 2020.03.12

+ Recent posts