[C++] 템플릿 클래스가 아닌 일반 클래스에서 템플릿 멤버함수의

ixevexi의 이미지

지금 이상한?? 문제점이 있는데
제가 가진 TC++PL에서 이 문제를 해결할 수 있는
힌트를 찾기 힘드네요 ㅡ.ㅡ;; 워낙 건성으로 읽어서...

지금 문제는 다음과 같은 코드가 있을때

in 'Source.h'


class whatever
{
private:
    //.......
public:
   // .....
   template<typename T>
   whatever& operator>>( T&  rhs);
   // .....
};

in 'Source.cpp'

template<typename T>
whatever& whatever::operator>>(T& rhs)
{
    // blah~ blah~ blah~;
    return *this;
}

이렇게 선언과 정의를 분리해두니
정의를 찾지못했따는 메시지가 나옵니다.
GCC: undefined reference어찌고...
VC.NET: ~~~(네임 맹글링된 함수)의 외부 기호를 찾지 못했습니다.

위의 템플릿 멤버 변수를
클래스안에 선언과 함꼐 정의해두면 문제없이 컴파일 됩니다.

음 제가 무얼 잘못했을까요?

File attachments: 
첨부파일 크기
Package icon widget.zip1002바이트
ixevexi의 이미지

조금 후에 책을 쭈욱 읽어보니
그냥 지나쳤던
export 키워드가있더군요

같은 translation unit에 있고, 선언과 정의를 분리했다면,
선언은 다른곳에 하고
정의할때 export키워드를 써서
다른 translation unit에서 접근가능하도록 해야한다고
쓰여있습니다.

그런데 -_-;; VC7.1에서는 아직도 지원이 안되네요
http://www.codeproject.com/cpp/stdexport.asp
여기를 보시면 됩니다.

후아 지금껏 VC7.1에서 표준이 지원이 안되는걸 본적이 없었는데..
제 짧은 영어로 훑어본 결과 workaround도 없는 거 처럼 보입니다.
ㅠ.ㅜ 그냥 .h 에다가 몰아서 쓸래요

PS. 한번 고쳤습니다 ㅠ.ㅜ translation unit에 정확한 이해가 없었습니다.

C++, 그리고 C++....
죽어도 C++

소리의 이미지

#include "Source.h" 소스파일에서 헤더파일 불러오는 걸 잊으신 것 같은데요. :)

죠커의 이미지

ixevexi wrote:
조금 후에 책을 쭈욱 읽어보니
그냥 지나쳤던
export 키워드가있더군요

export를 지원하는 컴파일러는 거의 없는 걸로 알고 있습니다.

일반적인 의견도 export를 구현하지 말자는 쪽인 걸로 알고 있습니다. export란 개념 자체가 잘 못된 것이라는 평이 주류인 것 같더군요.

ssehoony의 이미지

템플릿 함수의 경우는 그 특성상 헤더에 정의를 해야합니다.
관례적으로 템플릿함수가 정의된 헤더는 .hpp 를 사용합니다.

저의 경우 헤더에 정의코드가 들어가면 헤더파일의 가독성이 떨어지는 것을 막기 위해 .hpp 와 .h 둘다 만들고 .h 에서 .hpp 를 include 하게 하고 템플릿 함수의 정의를 .hpp 에 넣는 방식을 사용합니다.
이렇게 하면 함수나 클래스의 사용자는 .h 만 include 하면 되기때문에 .hpp 도 같이 해야할지 말아야할지 여부를 고민하지 않아도 되고, .hpp 의 존재 여부도 알 필요가 없지요.

ixevexi의 이미지

소리 wrote:
#include "Source.h"
소스파일에서 헤더파일 불러오는 걸 잊으신 것 같은데요. :)

당연히 헤더파일은 넣어두었습니다 :D

CN wrote:
export를 지원하는 컴파일러는 거의 없는 걸로 알고 있습니다.

일반적인 의견도 export를 구현하지 말자는 쪽인 걸로 알고 있습니다. export란 개념 자체가 잘 못된 것이라는 평이 주류인 것 같더군요.

사실 제가 깊이 없이 C++을 공부해서
무엇이 잘못되었는지 알고싶습니다.
결론적으로 선언과 정의를 템플릿은 분리를 못한다는 이야기입니까?

devilhero wrote:
템플릿 함수의 경우는 그 특성상 헤더에 정의를 해야합니다.
관례적으로 템플릿함수가 정의된 헤더는 .hpp 를 사용합니다.

저의 경우 헤더에 정의코드가 들어가면 헤더파일의 가독성이 떨어지는 것을 막기 위해 .hpp 와 .h 둘다 만들고 .h 에서 .hpp 를 include 하게 하고 템플릿 함수의 정의를 .hpp 에 넣는 방식을 사용합니다.
이렇게 하면 함수나 클래스의 사용자는 .h 만 include 하면 되기때문에 .hpp 도 같이 해야할지 말아야할지 여부를 고민하지 않아도 되고, .hpp 의 존재 여부도 알 필요가 없지요.

저의 고민도 마찬가지인데 사실 잘 이해가 가지 않습니다.
저기 위에 클래스를 선언해 두고
template덕에 템플릿 멤버 함수들만 정의를 해두어서
상당히 보기 싫습니다.
그러니까 저는 .h 파일에 template멤버함수 정의 + 기타 멤버 함수 선언 .cpp파일에 기타 멤버함수 정의
이런식으로 했었는데
명쾌하게
.h에는 무엇을 .hpp에는 무엇을 넣어야할지 잘 모르겠어요 ^^
다시한번 자세히 설명해 주실 수 있을까요?

C++, 그리고 C++....
죽어도 C++

byung82의 이미지

template 을 쓰는것은 컴파일 컴파일러가 알아서 타입을 맞추게 됩니다.

그런데 문제는 object로 .cpp 파일로 가게 되면 그 작업이 불가능하게 됩니다.

이렇게 되어서 나온것이 export인데 아직 export를 지원하는 컴파일러는 없는걸로 알고 있습니다.

결국 template를 선언한 함수를 전적으로 h파일로 하셔야 합니다.

보이는게 좀 이상하시다면 이런씩으로 하실수도 있습니다.

test.h

class test
{
public:
template<typename T>T get();
}

#include <test1.h>

test1.h

template<typename T>T test::get()
{
return NULL;
}

이렇게 분리해서 h파일을 관리하시면 조금더 깔끔하게 관리를 하실 수 있습니다 ^^:

ssehoony의 이미지

.cpp 에 하셨던 모든 템플릿 멤버 함수를 모두 .hpp 로 옮기시고
.hpp 를 .h 의 클래스 선언부 하단에 include .hpp 를 추가 하시면 됩니다.

예제 소스를 올립니다.

댓글 첨부 파일: 
첨부파일 크기
Package icon 0바이트
ixevexi의 이미지

친절한 답변에 대단히 감사드립니다. :D

C++, 그리고 C++....
죽어도 C++

댓글 달기

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