비공개2011. 8. 8. 17:07

동일 이름의 템플릿 함수를 선택할때 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");
}






 

테스트 취지는, 템플릿 관련 정보를 찾아보던 중 특수화 함수 > 템플릿 함수 > 일반 함수 순서라고 설명이 나와서 확인 해 본것이다.

두곳을 봤는데 한곳이 저렇게 설명하였고, 다른 하나 곳은 컴파일러마다 판별 우선순위에 있어 차이가 있다라고 나온다.

다른 컴파일러에서는 확인을 안해봤지만 컴파일러마다 차이가 있을 것에 한표!!!

즉, 프로그래밍을 함에 있어 이러한 점을 고려하지 않는다면 의도하지 않는 함수가 호출 될 수 있다.

 
Posted by 닭꽝