반응형
- 함수와 템플릿
- square는 함수가 아닌 함수 템플릿, square<int>가 함수
template<typename T> T square(T a)
{
return a * a;
}
int main()
{
printf("%p\n", &square); // 함수 템플릿의 주소 출력 error
printf("%p\n", &square<int>); // int 버전 함수 주소 출력 ok
printf("%p\n", static_cast<int(*)(int)>(&square)); // int 버전 함수로 캐스팅후 주소 출력 ok
auto p = □ // 함수 템플릿 주소는 담을 수 없으므로 error
auto p = &square<int>; // int 버전 함수 주소 담기 ok
auto p = static_cast<int(*)(int)>(&square); // int 버전 함수 주소 담기 ok
}
- 템플릿의 구현부는 항상 헤더파일에 함께 제공하여야 함
- 아래와 같이 함수 템플릿을 헤더와 소스파일로 분리하면 main에서 square 호출 시 실제 Lib.h 헤더파일만 참고하므로 템플릿을 기반으로 실제 int형 함수 생성이 필요한데 생성할 구현부 확인이 불가능하여 에러 발생
// 함수 템플릿을 선언과 구현부를 헤더와 소스파일로 분리한 잘못 구현한 예
////////////////////////////////////////
// Lib.h
int add(int a, int b);
template<typename T> T square(T a);
////////////////////////////////////////
////////////////////////////////////////
// Lib.cpp
int add(int a, int b)
{
return a + b;
}
template<typename T> T square(T a)
{
return a * a;
}
////////////////////////////////////////
////////////////////////////////////////
// main.cpp
#include "Lib.h"
int main()
{
add(1, 2);
square(3);
}
////////////////////////////////////////
// 함수 템플릿을 헤더 파일로 모두 제공한 예
////////////////////////////////////////
// Lib.h
int add(int a, int b);
template<typename T> T square(T a)
{
return a * a;
}
////////////////////////////////////////
////////////////////////////////////////
// Lib.cpp
int add(int a, int b)
{
return a + b;
}
////////////////////////////////////////
////////////////////////////////////////
// main.cpp
#include "Lib.h"
int main()
{
add(1, 2);
square(3);
}
////////////////////////////////////////
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 비주얼스튜디오에서 boost 라이브러리 사용 방법 (0) | 2019.06.30 |
---|---|
C++ 지연 인스턴스화(Lazy Instantiation) (0) | 2019.05.28 |
C++ 템플릿 Identity (0) | 2019.05.28 |
C++ Idioms/Object Generator (0) | 2019.05.28 |
C++ 템플릿 타입 추론(Template Argument Type Deduction) (0) | 2019.05.21 |