동일 이름의 템플릿 함수를 선택할때 Visual Studio 2010 컴파일러는 다음 순서대로 우선순위를 결정한다.
일반 함수 > 특수화 함수 > 템플릿 함수
테스트는 다음 코드로 하였다.
using namespace std;
// 템플릿 함수
// 템플릿 함수은 한정자( const ) 사용 불가!
template < typename T1, typename _T2 >
const T1& Max( const T1& _a, const _T2& _b)
{
cout << "Max(const double& a, const double& b) 템플릿 버전 사용" << endl;
return _a > _b ? _a : _b;
};
// 템플릿 함수 특수화
template <>
const double& Max<double>( const double& _a, const double& _b )
{
cout << "Max(const double& a, const double& b) 특수화 버전 사용" << endl;
return _a > _b ? _a : _b;
}
// 일반 함수
const double& Max( const double& _a, const double& _b )
{
cout << "Max(const double& a, const double& b) 일반 함수 버전 사용" << endl;
return _a > _b ? _a : _b;
}
void main()
{
int Char1_HP = 300;
int Char2_HP = 400;
int MaxCharHP = Max( Char1_HP, Char2_HP );
cout << "HP 중 가장 큰 값은" << MaxCharHP << "입니다." << endl << endl;
float Char1_Exp = 250.0f;
float Char2_Exp = 250.57f;
float MaxCharExp = Max( Char1_Exp, Char2_Exp );
cout << "경험치 중 가장 큰 값은" << MaxCharExp << endl << endl;
double Char2_MP = 300;
double Char2_SP = 400.25f;
double MaxValue2 = Max( Char2_MP, Char2_SP );
cout << "MP와 SP 중 가장 큰 값은" << MaxValue2 << endl << endl;
system("pause");
} |
테스트 취지는, 템플릿 관련 정보를 찾아보던 중 특수화 함수 > 템플릿 함수 > 일반 함수 순서라고 설명이 나와서 확인 해 본것이다.
두곳을 봤는데 한곳이 저렇게 설명하였고, 다른 하나 곳은 컴파일러마다 판별 우선순위에 있어 차이가 있다라고 나온다.
다른 컴파일러에서는 확인을 안해봤지만 컴파일러마다 차이가 있을 것에 한표!!!
즉, 프로그래밍을 함에 있어 이러한 점을 고려하지 않는다면 의도하지 않는 함수가 호출 될 수 있다.
'비공개' 카테고리의 다른 글
UNICODE와 MBCS 호환성 및 사용법 (0) | 2011.08.11 |
---|---|
C++에서 템플릿의 선언/정의부를 h/cpp 처럼 분리하기 (0) | 2011.08.09 |
VS2010 코딩시 유의점( 네이밍#1 ) (0) | 2011.07.20 |
Google C++ Style Guide (구글 C++ 엔지니어들의 코딩 스타일) (0) | 2011.07.14 |
[ Effective C++ ] Item 3. 자원관리 (0) | 2011.07.07 |