[C++] 함수 템플릿 에서 부분 특수화 에 대해서 궁금합니다.

ssonacy의 이미지

제목글은 약간의 낚시(?) 성이구요 ㅎ ; 죄송해요 ~ 다름이 아니구

함수 템플릿은 부분 특수화가 되지 않는다고 알고 있는데요.

그래서 함수 오버로딩을 통해서 부분 특수화 같은 효과를 내는것으로 알고 있어요,

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 >() );
....

이것은 동작않하네요. 왜일까요 ???
더 정확하게 말씀드려서는 컴파일 에러가 나네요.

해당 부분이 왜 문법 오류가 난것일까요 ?

klara의 이미지

'동작하지 않는다'는 것은 아무것도 설명하지 않는 것과 같습니다.
문제가 있다면 어떤 문제인지를 적으셔야죠.
컴파일이 안되는건지, 컴파일이 되지만 원하는 결과가 안나오는 건지, 원하는 결과가 안나오는 거라면 어떤 결과를 원했는데 실제론 어떤 결과가 나왔는지를 적으셔야 제대로 답변 받을 수 있습니다.
참고로 적으신 코드는 typename을 TypeTrait::pointer_type이나 TypeTraint::default_type앞에 붙여주셔야 컴파일이 될겁니다.

ssonacy의 이미지

죄송해요~ 다시 수정했습니다.

ssonacy의 이미지

아 붙이니까 컴파일이 되네요 ㅠ 감사합니다.

ssonacy의 이미지

그런데 생각해 보니까 왜....

리턴 타입에만 typename 을 붙이니, 컴파일이 될까요 ?

#include<crtdbg.h>
 
template< typename T >
struct TypeTrait 
{ 
	typedef T   default_type; 
	typedef T*  pointer_type;
	typedef T&  reference_type;
};
 
template< typename T , typename A >
T* CreateInstance( const A& Arg , TypeTrait<T> )
{
	return new TypeTrait<T>::default_type( Arg );
}
 
int main()
{
	int* p = CreateInstance( 'a' , TypeTrait< int >() );
 
	return 0;
}

이것은 컴파일이 잘 되거든요..
컴파일러는 VC2008 입니다.

klara의 이미지

VC의 버그 또는 확장입니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.