함수 템플릿에 문자열 리터럴을 인자로 사용.
함수템플릿의 레퍼런스 파라미터로 문자열을 전달할경우 일어날수 있는 일들.
template <typename T>
inline T const & max( T const & a, T const & b )
{
return a < b ? b : a;
}
-- main
::max("test","best");
위의 내용을 컴파일 하면 아래와 같은 에러가 뜬다.
error C2440: 'return' : 'const char *'에서 'const char (&)[5]'(으)로 변환할 수 없습니다.
컴파일 중인 함수 템플릿 인스턴스화 'T (&max<const char[5]>(T (&),T (&)))'에 대한 참조를 확인하십시오.
with
1> [
1> T=const char [5]
1> ]
머야.이건...ㅡㅡ;...무서워..
참조자로 받지 않으면 어떻게 되니??
template <typename T>
inline T const & max( T const a, T const b )
{
return a < b ? b : a;
}
잘되는군..빌어먹을녀석...까탈스럽긴...
테스트
template <typename T>
void ref(T const& x)
{
std::cout<<"x in ref(T const&): " << typeid(x).name()<<std::endl;
}
template <typename T>
void nonref(T x)
{
std::cout<<"x in nonref(T): " <<typeid(x).name()<<std::endl;
}
-- main
ref("test");
nonref("tester");
결과
x in ref(T const&): char const [5]
x in nonref(T): char const *
이런동작은 인자추론 단계에서 배열-포인터변환은 파라미터가 참조자가 아닐 경우에만 일어나기 때문이다.
해결책
. 참조자 대신 참조자가 아닌것을 사용한다. - 이러면 불필요한 복사를 할수 있다.
. 참조자와 참조자가 아닌 파라미터 모두에 대해 오버로딩한다.
. 실제 데이터형으로 오버로딩 한다. - std::string
. 배열형으로 오버로딩한다.
. 애플리케이션 프로그래머가 항상 명시적으로 변환하게 한다.
'Study > Template' 카테고리의 다른 글
템플릿 인자와 템플릿 파라미터 (0) | 2010.07.08 |
---|---|
인스턴스화와 특수화 (0) | 2010.07.06 |
템플릿 템플릿 파라미터 (0) | 2010.06.30 |
데이터형이 아닌 클래스 템플릿 파라미터 (2) | 2010.06.25 |
기본 템플릿 인자 (0) | 2010.06.25 |