[완료][c++]자료구조 stack을 공부하고 있는데 template적용이 안돼요.
글쓴이: interoasis / 작성시간: 화, 2011/05/10 - 4:28오후
//In file Stack.h #include <iostream> using namespace std; template <class T> class Stack { public: Stack(); void Push(const T parameter); T Pop(); int Size() const; bool IsEmpty() const; private: T *stack; T *top; int size; };
//In file Stack.cpp #include "Stack.h" template <class T> Stack<T>::Stack() { stack = new T[10]; top = stack; size = 0; } template <class T> void Stack<T>::Push(const T parameter) { top[++size] = parameter; } template <class T> T Stack<T>::Pop() { return top[size--]; } template <class T> int Stack<T>::Size() const { return size; } template <class T> bool Stack<T>::IsEmpty() const { return size == 0; }
//In file mainStack.cpp #include "Stack.h" int main(void) { Stack<int> testStack; testStack.Push(3); testStack.Push(5); cout << testStack.Pop() << endl; cout << testStack.Pop() << endl; }
이렇게 스택의 뼈대만 구현해서 컴파일을 하는데요. 에러가 납니다. 위의 T부분을 int로 바꿔주면 정상동작하구요. 책에서 template부분 봐가면서 쓴건데 왜 에러가 나는지 모르겠네요.
g++ -o Stack Stack.h Stack.cpp mainStack.cpp
위 명령어를 쳐서 컴파일하려면
/tmp/cciKn6zJ.o: In function `main': mainStack.cpp:(.text+0x11): undefined reference to `Stack<int>::Stack()' mainStack.cpp:(.text+0x35): undefined reference to `Stack<int>::Push(int)' mainStack.cpp:(.text+0x49): undefined reference to `Stack<int>::Push(int)' mainStack.cpp:(.text+0x55): undefined reference to `Stack<int>::Pop()' mainStack.cpp:(.text+0x81): undefined reference to `Stack<int>::Pop()' collect2: ld returned 1 exit status
이런 에러를 뿜으며 컴파일이 안됩니다.분명히 다 정의돼있는 함수인데 정의가 안돼있다고하니...;;
고수님들 답변좀 부탁드릴께요.
Forums:
stack.cpp 를 stack.h 에 모두 넣으세요.
C++ 를 차근차근 해나가는 사람들이 한번쯤 하는 어려움이죠. 아직까지 template은 모두 header file 에 정의되어야 합니다.
템플릿은 사용되는 구체적인 타입으로 바뀌어 컴파일이
템플릿은 사용되는 구체적인 타입으로 바뀌어 컴파일이 됩니다.(instantiation)
그런데 main.cpp 에 헤더 파일만 include 되기 때문에 헤더부분은 T 가 정수 타입인 클라스로 컴파일이 되지만, 별도의 Stack.cpp 파일은 구체적인 타입이 지정되지 않아 컴파일조차 되지 않고, 따라서 링크 타임 에러가 나게 되죠.
이럴수가... 이것때문에 2주일을 보냈는데...
이럴수가... 이것때문에 2주일을 보냈는데... ㅠ.,ㅜ 답변 정말 감사드립니다. 왜 이런 중요한 내용이 책에는 안나와있는걸까요? 크흑~
boost 소스 한번 열어 보세요. hpp 라는
boost 소스 한번 열어 보세요. hpp 라는 확장자를 곧잘 씁니다.
댓글 달기