본문 바로가기
프로그래밍/C++

C++ 템플릿 클래스

by Hwan2 2019. 5. 17.
반응형

 

 

 

 

템플릿은 클래스에서도 적용이 가능 합니다.

#include<iostream>

using namespace std;

template <class T>
class Calculator{
private:
    T x, y;
public : 
    Calculator(T n1, T n2) : x(n1), y(n2) {}
    
    T Adder(){
        return x + y;
    }
};

int main(void){
    Calculator<int> cal1(10, 20);
    Calculator<double> cal2(1.5, 20.99999);
    cout << cal1.Adder() << endl;
    cout << cal2.Adder() << endl;
    
    return 0;
}

 

또한 외부 선언도 가능 합니다.

#include<iostream>

using namespace std;

template <class T>
class Calculator{
private:
    T x, y;
public : 
    Calculator(T n1, T n2) : x(n1), y(n2) {}
    T Adder();
};

template<class T>
T Calculator<T>::Adder(){
    return x + y;
}

int main(void){
    Calculator<int> cal1(10, 20);
    Calculator<double> cal2(1.5, 20.99999);
    cout << cal1.Adder() << endl;
    cout << cal2.Adder() << endl;
    
    return 0;
}

 

여기서 주의해야할 점은 파일 분할할때 입니다.

 

템플릿 클래스는 기본적으로 일반 클래스랑 다른 취급을 합니다.

 

보통 해더파일, 해더파일의 정의를 하는 파일(cpp), main함수 파일... 이런식으로 진행됩니다.

 

그리고 컴파일러는 .obj소스 파일을 만들어 내고 이를 링커를 통해 연결시키는 형식으로 진행됩니다.

 

하지만 템플릿 클래스는 일반 클래스와는 다르게 사용하지 않으면 클래스의 인스턴스화를 시키지 않습니다.

 

따라서 컴파일의 링커 과정에서 인스턴스된 템플릿 클래스가 없어 컴파일 에러가 발생합니다.

 

해결 방법은 해더파일에 템플릿 클래스에 대한 정의를 넣어주거나

 

템플릿 클래스에 대한 정의를 따로 만든 후 해당 파일(cpp)를 #include를 통해 읽어오면 됩니다.

 

보기 편하고 간편한건 해더 파일에 정의하는 것입니다. 물론 자유지만....

 

 

 

 

 

반응형

댓글


스킨편집 -> html 편집에서