[C++] 템플릿 클래스가 아닌 일반 클래스에서 템플릿 멤버함수의
글쓴이: ixevexi / 작성시간: 일, 2005/02/13 - 4:44오후
지금 이상한?? 문제점이 있는데
제가 가진 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:
첨부 | 파일 크기 |
---|---|
widget.zip | 1002바이트 |
Forums:
자답입니다 -_-;;
조금 후에 책을 쭈욱 읽어보니
그냥 지나쳤던
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++
[code:1]#include "Source.h"[/c
#include "Source.h"
소스파일에서 헤더파일 불러오는 걸 잊으신 것 같은데요. :)Re: 자답입니다 -_-;;
export를 지원하는 컴파일러는 거의 없는 걸로 알고 있습니다.
일반적인 의견도 export를 구현하지 말자는 쪽인 걸로 알고 있습니다. export란 개념 자체가 잘 못된 것이라는 평이 주류인 것 같더군요.
- 죠커's blog / HanIRC:#CN
템플릿 함수의 경우는 그 특성상 헤더에 정의를 해야합니다.관례적으로
템플릿 함수의 경우는 그 특성상 헤더에 정의를 해야합니다.
관례적으로 템플릿함수가 정의된 헤더는 .hpp 를 사용합니다.
저의 경우 헤더에 정의코드가 들어가면 헤더파일의 가독성이 떨어지는 것을 막기 위해 .hpp 와 .h 둘다 만들고 .h 에서 .hpp 를 include 하게 하고 템플릿 함수의 정의를 .hpp 에 넣는 방식을 사용합니다.
이렇게 하면 함수나 클래스의 사용자는 .h 만 include 하면 되기때문에 .hpp 도 같이 해야할지 말아야할지 여부를 고민하지 않아도 되고, .hpp 의 존재 여부도 알 필요가 없지요.
[quote="소리"][code:1]#include "Sourc
당연히 헤더파일은 넣어두었습니다 :D
사실 제가 깊이 없이 C++을 공부해서
무엇이 잘못되었는지 알고싶습니다.
결론적으로 선언과 정의를 템플릿은 분리를 못한다는 이야기입니까?
저의 고민도 마찬가지인데 사실 잘 이해가 가지 않습니다.
저기 위에 클래스를 선언해 두고
template덕에 템플릿 멤버 함수들만 정의를 해두어서
상당히 보기 싫습니다.
그러니까 저는 .h 파일에 template멤버함수 정의 + 기타 멤버 함수 선언 .cpp파일에 기타 멤버함수 정의
이런식으로 했었는데
명쾌하게
.h에는 무엇을 .hpp에는 무엇을 넣어야할지 잘 모르겠어요 ^^
다시한번 자세히 설명해 주실 수 있을까요?
C++, 그리고 C++....
죽어도 C++
참조
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파일을 관리하시면 조금더 깔끔하게 관리를 하실 수 있습니다 ^^:
.cpp 에 하셨던 모든 템플릿 멤버 함수를 모두 .hpp 로 옮기시고
.cpp 에 하셨던 모든 템플릿 멤버 함수를 모두 .hpp 로 옮기시고
.hpp 를 .h 의 클래스 선언부 하단에 include .hpp 를 추가 하시면 됩니다.
예제 소스를 올립니다.
친절한 답변에 대단히 감사드립니다. :D
친절한 답변에 대단히 감사드립니다. :D
C++, 그리고 C++....
죽어도 C++
댓글 달기