함수 템플릿에 문자열 리터럴을 인자로 사용.

반응형


함수템플릿의 레퍼런스 파라미터로 문자열을 전달할경우 일어날수 있는 일들.

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
TAGS.

Comments