[C++] 함수 템플릿 에서 부분 특수화 에 대해서 궁금합니다.
글쓴이: ssonacy / 작성시간: 월, 2015/04/20 - 5:28오후
제목글은 약간의 낚시(?) 성이구요 ㅎ ; 죄송해요 ~ 다름이 아니구
함수 템플릿은 부분 특수화가 되지 않는다고 알고 있는데요.
그래서 함수 오버로딩을 통해서 부분 특수화 같은 효과를 내는것으로 알고 있어요,
template< typename T > struct TypeTrait { typedef T type; }; template< typename T , typename A > T* CreateInstance( const A& Arg , TypeTrait<T> ) { return new T( Arg ); } .... int* p = CreateInstance( 3 , TypeTrait< int >() ); ..
또는
char* p = CreateInstance( 'a' , TypeTrait< char >() );
이런식으로 오버로딩을 통한, 부분 특스화 처럼 동작을 하는거 까지는 이해 됬는데,
조금 쌩뚱맞게....이렇게 고쳐 봤습니다.
template< typename T > struct TypeTrait { typedef T default_type; typedef T* pointer_type; typedef T& reference_type; }; template< typename T , typename A > TypeTrait<T>::pointer_type CreateInstance( const A& Arg , TypeTrait<T> ) { return new TypeTrait<T>::default_type( Arg ); } ... int* p = CreateInstance( 10 , TypeTrait< int >() ); ....
이것은 동작않하네요. 왜일까요 ???
더 정확하게 말씀드려서는 컴파일 에러가 나네요.
해당 부분이 왜 문법 오류가 난것일까요 ?
Forums:
'동작하지 않는다'는 것은 아무것도 설명하지 않는
'동작하지 않는다'는 것은 아무것도 설명하지 않는 것과 같습니다.
문제가 있다면 어떤 문제인지를 적으셔야죠.
컴파일이 안되는건지, 컴파일이 되지만 원하는 결과가 안나오는 건지, 원하는 결과가 안나오는 거라면 어떤 결과를 원했는데 실제론 어떤 결과가 나왔는지를 적으셔야 제대로 답변 받을 수 있습니다.
참고로 적으신 코드는 typename을 TypeTrait::pointer_type이나 TypeTraint::default_type앞에 붙여주셔야 컴파일이 될겁니다.
죄송해요~ 다시 수정했습니다.
죄송해요~ 다시 수정했습니다.
아 붙이니까 컴파일이 되네요 ㅠ 감사합니다.
아 붙이니까 컴파일이 되네요 ㅠ 감사합니다.
그런데 생각해 보니까 왜.... 리턴 타입에만
그런데 생각해 보니까 왜....
리턴 타입에만 typename 을 붙이니, 컴파일이 될까요 ?
이것은 컴파일이 잘 되거든요..
컴파일러는 VC2008 입니다.
VC의 버그 또는 확장입니다.
VC의 버그 또는 확장입니다.
댓글 달기