템플릿 특수화는 왜 번역단위당 중복정의가 안되나요?

vani2의 이미지

함수템플릿 특수화를 했는데 오류가 나네요.

*편의상 h파일은 사용하지 않았으며 main함수를 생략합니다.

1.cpp

template <typename T1, typename T2>
T1 foo2(T2 type)
{
	return static_cast<T1>(type);
}
 
 
template <>
int foo2<int,char>(char type)
{
	return static_cast<int>(type);
}

2.cpp

template <typename T1, typename T2>
T1 foo2(T2 type)
{
	return static_cast<T1>(type);
}
 
 
template <>
int foo2<int,char>(char type)
{
	return static_cast<int>(type);
}

위와 같이 2개의 소스파일에 함수템플릿과 그 템플릿의 특수화를 정의했는데요,

링크때 두 특수화 함수가 중복정의 됬다면서 오류가 뜨네요. (main은 편의상 생략)

그래서 찾아봤더니 특수화 함수는 클래스 템플릿의 멤버함수 정의를 포함하여 모두 정의파일에 정의후 헤더파일엔 원형만 남겨두어야 한다고 하는데
왜 특수화 함수 템플릿은 헤더파일에 정의하면 안되는 건가요?

추가질문 :
특수화된 함수 템플릿이나 클래스 템플릿은 그 즉시 구체화 되나요?
typedef문으로 타입지정한 경우도 즉시 구체화 되나요?

winner의 이미지

제가 C++를 그렇게 파고들지를 않아서... 왜 이런 source 를 작성했는지 궁금하네요.
솔직히 전 compile 시간을 늘리는 template 도 안 좋아하고, 그걸 넘어 실행시간에 programmer 에게 자비가 없는 C++ 를 별로 안 좋아해서...
C++ 의 짜증나는 점은 C보다 고수준의 기능을 제공하면서 최적화를 통해 실제동작은 C에 가깝게 혹은 C를 능가하는 성능을 목표로 하는 놈이라 programmer 의 예측을 넘어서는 결과를 보여주는 경우가 많다는 점이라고 생각합니다.

vani2의 이미지

음..

헬퍼클래스 정의를 위해서 템플릿이 반드시 필요한 저로썬..

하지만 특수화는 되도록 사용하지 않는것이 좋다고 들어서 특수화는 한번 연습해보고 사용하지 않을려고 마음을 먹었는데..
이번에 실험해보고서 특수화 정의만큼은 소스파일에 써야한다는것을 알았네요..

C++이 게임쪽에 강력하다해서 이쪽으로 전향해왔지만..

winner님 말씀대로 C++은 배운내용 이상으로 넘어가면 약간 예기치못한 일이 일어나곤하네요..

행인의 이미지

필요하게 됩니다.. 설계를 하는 단계가 아니신거 같은데..
저는 유연한 설계를 위해서 C++11의 기능을 거의 전부 활용하고 있습니다.
그리고 덕분에 엄청 유연한 프레임워크/ 라이브러리가 탄생하게 되었죠..
다만.. 설계상 자주 사용하게 될 객체에(루프내에서 계속 생성되고 소멸되어야 하는 객체들)
기능이나 다형성을 위해서 2단계 이상 상속을 받게되면, 그 오버헤드가.. 생각보다 만만치 않습니다.
심지어 멤버 변수가 많아지면 초기화 비용이 비싸다는걸 느낄 수 있죠
O(n^2) 이상의 루프에서는 비 상속 객체에 대비해서 확실히 비용 소모가 있다는 단점이 있으나,
다른부분에서 최적화를 잘 해서 비용을 절약하면, 프로그래밍의 유연함과 속도를 모두 잡을 수 있는
프로그램이 나오게 되죠.

익명 사용자의 이미지

저렇게 선언하는건 template이 아니라
class라도 안되고
function이라도 안됩니다

template이라고 특별히 저게 가능해야 할 이유는 없어보이네요

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.