template을 헤데에만 정의해야 하는 이유가 뭐죠..??

psjcap의 이미지

그냥 궁금해서 올립니다..
헤더에데만 써야하는 이유가 있을 듯 싶은데..

그럼 좋은 하루되셔요..^___^"

moonzoo의 이미지

글쎄요..꼭 그럴필요가 있을까요?

그건 마치 define문을 header에만 써야 된다는 것과 유사하게

들립니다만..

지역적으로 사용되는 것이라면 해당 소스에서 정의하셔도 되지 않을까요?

이상 C 적인 생각이었습니다.--;

C++은 안해본지 오래되서 모르겠지만..마찬가지일꺼라 생각됩니다..

pynoos의 이미지

Header에 넣는 것은 선언만 넣습니다.
가끔, static 객체도 넣긴하구요.

c, cc 등에 넣는 것은 정의나 local 선언 등을 넣습니다.

그렇게 하는 주된이유는 header만으로는 파일간 공유되는 전역으로 참조되는 object 심볼들이 만들어지기 때문입니다.

template은 그 자체만으로는 정의처럼 보이는 것 조차도 실은 위에 해당하는 심볼이 만들어지지 않습니다. 사용되는 곳에서 만들어지는 것이지요.

사용되는 순간 적당한 형이 완성이 되면서 만들어지는 것이므로 c, cc에 두는 것은 이상한 꼴이 됩니다.

psjcap의 이미지

음... 그것 때문이 아니라..
보통 c++ 코딩을 할 경우 .h랑 .cpp 로 나누어서 만든 후에..
.o를 만들고.. Link해서 실행 파일을 만드는데..

template을 만들경우.. 위와 같이 하면 에러가 나거든요.. 컴파일 할 때..
그래서 #include *.cpp 같은 편법을 쓰기도 하지만..
실제론 header로만 사용하는 거나 마찬가지거든요..

궁금한건 왜 저기서 컴파일 할 때 에러가 나냐 하는거거든요..
export를 쓰면 된다는 이야길 들은 거 같긴한데..
지원하는 컴파일러가 없다는 이야기도 들었거든요..ㅠㅠ

pynoos의 이미지

#include "templateblah.cpp"

이렇게 쓰는 것이 편법이 아닙니다.

보기 흉할 뿐이죠..

#include "templatebla-impl.h"

이렇게 이름을 주기도 하죠 이름에 impl 이 들어가도록..

만들어진 .o 파일을 nm 해보세요. object가 만들어지지 않습니다. 단지 syntax check만 할 뿐입니다.

template은 형이 없이 만들어진 것인데 어떤 컴파일러가 object를 만들어내고 link할 수 있겠습니까.. :)

psjcap의 이미지

말씀하신데로.. object가 않 만들어지는 이유가 궁금한거지요..
왜 않 만들어질까요..??

pynoos의 이미지

첫번째글 wrote:
사용되는 순간 적당한 형이 완성이 되면서 만들어지는 것이므로

두번째글 wrote:
template은 형이 없이 만들어진 것인데

그것은 형이 없이 정의되어 있기 때문입니다.

왜 형이 없냐고 물어 보신다면... 그것은...template이기 때문이지요.

(맏이라서 그런가.. :))

yielding의 이미지

C++표준은 (ISO/IEC 14882), stroupstrupTCPL 3rd에는 export라는 키워드를 써서 template의 선언과 구현을 .h .cpp로 구분하는 것을 표준으로 정의하고 있지만 지금의 컴파일러가(gcc, codewarrior, vc7.1 등) 그걸 구현하지 않고 있습니다. (구현 못하고 있다고 하는것이 정확한 표현이겠죠. partail template specialization이 표준은 1998년에 만들어 졌지만 vc는 2003년에 gcc도 3.x에 와서야 비로서 구현될걸 보면 알수있습니다.)

Life rushes on, we are distracted

M.W.Park의 이미지

여러가지 이론이 있을 수 있지만,
제가 봤던 문구 중에 가장 기억에 남는 것은...
실질적 malloc이 일어나지 않는 것을 헤더에, malloc이 일어나는 것은 본체(?)에 둔다는 문장이었는데요.
아주 직관적이면서 기억하기 쉽고 단순하면서, 고민을 덜게 해주죠... 8)

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

죠커의 이미지

yielding wrote:
C++표준은 (ISO/IEC 14882), stroupstrupTCPL 3rd에는 export라는 키워드를 써서 template의 선언과 구현을 .h .cpp로 구분하는 것을 표준으로 정의하고 있지만 지금의 컴파일러가(gcc, codewarrior, vc7.1 등) 그걸 구현하지 않고 있습니다. (구현 못하고 있다고 하는것이 정확한 표현이겠죠. partail template specialization이 표준은 1998년에 만들어 졌지만 vc는 2003년에 gcc도 3.x에 와서야 비로서 구현될걸 보면 알수있습니다.)

export는 대부분의 컴파일러가 구현 "안하고" 있습니다. 벤더들은 이 키워드를 비난하며 지원하지 않을 것이다고 이야기 합니다.

C++ 표준화 위원들 사이에서도 export는 평이 좋지 못합니다.

댓글 달기

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