[완료][c++]자료구조 stack을 공부하고 있는데 template적용이 안돼요.

interoasis의 이미지

//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

이런 에러를 뿜으며 컴파일이 안됩니다.분명히 다 정의돼있는 함수인데 정의가 안돼있다고하니...;;
고수님들 답변좀 부탁드릴께요.
winner의 이미지

C++ 를 차근차근 해나가는 사람들이 한번쯤 하는 어려움이죠. 아직까지 template은 모두 header file 에 정의되어야 합니다.

ifree의 이미지

템플릿은 사용되는 구체적인 타입으로 바뀌어 컴파일이 됩니다.(instantiation)

그런데 main.cpp 에 헤더 파일만 include 되기 때문에 헤더부분은 T 가 정수 타입인 클라스로 컴파일이 되지만, 별도의 Stack.cpp 파일은 구체적인 타입이 지정되지 않아 컴파일조차 되지 않고, 따라서 링크 타임 에러가 나게 되죠.

interoasis의 이미지

이럴수가... 이것때문에 2주일을 보냈는데... ㅠ.,ㅜ 답변 정말 감사드립니다. 왜 이런 중요한 내용이 책에는 안나와있는걸까요? 크흑~

neocoin의 이미지

boost 소스 한번 열어 보세요. hpp 라는 확장자를 곧잘 씁니다.