본문 바로가기
Programming/C/C++

Template Class 만들 때 주의할 점

by 황금표정 2013. 1. 28.

출처 : http://mycpp.blog.me/120147433633

 

template class를 인라인으로 만들관 상관 없지만

함수 밖에 뺀다면 template <typename T>void Stack<T>::함수이름() 형식을 맞춰 줘야 한다.

근데 여기서 주의할 점! template class는 헤더파일과 cpp파일을 분리해서 작성하는 것을 지원하지 않는다.


만약 다음과 같이 한다면 ...


=== stack.h 파일 ====

template <typename T>


class Stack

{

protected:

        int top;

        T m_data[10];

       

public:

        Stack();

        void push(T data);

        void print();

 

};

 

 

 

=== stack.cpp 파일 ====

#include "stack.h"

 

 

template <typename T>Stack<T>::Stack()

{       top = 0;

}

 

template <typename T>void Stack<T>::push(T data)

{

        m_data[top++] = data;

}

 

template <typename T>void Stack<T>::print()

{      

        for(int i=0;i<top;i++)

               cout<<m_data[i]<<"  ";

}

 

 

=== main.cpp 파일 ====

 

#include <iostream>

#include <string>

using namespace std;

 

#include "stack.h"  //stack.cpp로 바꾸지 않으면 에러


void main()

{

        Stack <int>s;

        s.push(10);

        s.push(20);

        s.push(30);

        s.print();

        cout<<endl;

 

        Stack <string>s2;

        s2.push("abc");

        s2.push("def");

        s2.push("ghi");

        s2.print();

        cout<<endl;

 

}


문법상 에러는 없으나 linking 에러 남

오류 1 error LNK2019: "public: void __thiscall Stack<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >::print(void)" (?print@?$Stack@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@@QAEXXZ) 외부 기호(참조 위치: _main 함수)에서 확인하지 못했습니다. main.obj


이유는 template class는 헤더와 cpp파일을 나누는 것을 지원하지 않기 때문이다.
때문에 이렇게 쓰고 싶으면 stack.cpp파일 코드를 긁어서 stack.h 아래 쓰던가,
두개로 나눠서 쓰고 싶다면 main.cpp파일을에서 include "stack.cpp"로 쓰면 된다.


==결과화면==
10  20  30
abc  def  ghi
계속하려면 아무 키나 누르십시오 . . .

 

반응형

'Programming > C/C++' 카테고리의 다른 글

[C++] string  (0) 2013.04.05
[C++] Friend 키워드  (0) 2012.06.10
CallBack 함수  (1) 2012.06.10