C++ class template


#include <iostream>

using namespace std;

template <typename T>
class Stack {
private:
    T* mData;
    int mMaxSize, mTop;
public :
    Stack();
    Stack(int _size);
    Stack(const Stack& _data);
    ~Stack();

    void push(T _data);
    T pop();
    bool isOperator(char _rhs);
    char* changeToPostfix();
    bool isFull();
    bool isEmpty();
};

int main(){

    cout << "Hello world!" << endl;
    return 0;
}

template <typename T>
Stack<T>::Stack()
    : mData(nullptr)
    , mMaxSize(0)
    , mTop(-1) {}

template <typename T> 
Stack<T>::Stack(int _size) 
    : mMaxSize(_size)
    , mTop(-1) {
    mData = new int[_size];
}

template <typename T>
Stack<T>::Stack(const Stack& _data) {

}

template <typename T>
Stack<T>::~Stack() {
    if (mData != nullptr) delete[] mData;
}

template <typename T>
void Stack<T>::push(T _data) {


}

template <typename T>
bool Stack<T>::isOperator(char _rhs) {
    return (_rhs == '*' || _rhs == '/' ||
            _rhs == '+' || _rhs == '-' ||
            _rhs == '(' || _rhs == ')');
}

template <typename T>
char* Stack<T>::changeToPostfix() {
    char* arithExp, postfixExp;
    cin >> arithExp;
    Stack<char> tempStack(strlen(arithExp));

    for (int i = 0; i < strlen(arithExp); i++) {

    }

    return postfixExp;
}

template <typename T>
bool Stack<T>::isFull() {
    return (mTop == mMaxSize - 1);
}

template <typename T>
bool Stack<T>::isEmpty() {
    return (mTop == -1);
}

클래스 템플릿으로 클래스 Stack을 작성하려고 하는데, Stack 클래스를 정의할 때 template으로 정의하면 위 처럼 모든 멤버 함수 를 정의 할 때 template 를 필수 적으로 써줘야 하나요?

  • 2016년 10월 14일에 작성됨
    컴퓨터공학과 재학중인 학생입니다.

조회수 125


1 답변


좋아요
3
싫어요
채택취소하기

네. 반드시 써줘야 합니다.

왜냐면 함수를 정의할 때, 'T' 라는 글자가 무엇을 뜻하는 지 알려줘야 하기 때문입니다.

template <typename T>         // 만약 이렇게 T가 템플릿의 타입이름이다. 라고 알려주지 않으면,
bool Stack<T>::isEmpty() {    // 여기서 <T>가 무엇을 뜻하는 지 컴파일러가 어떻게 알까요?
    return (mTop == -1);
}

만약 클래스 템플릿의 멤버함수 정의를 내부에 할 경우에는 굳이 알려주지 않아도 됩니다.

template <typename T>    // 이 선언은 아래 스코프{} 전체에 적용됩니다.
class Stack {
private:
    T* mData;
    int mMaxSize, mTop;
public :
    bool isEmpty() {     // 여기서는 T가 무엇인지 이미 알고 있기 때문에 괜찮습니다.
        return (mTop == -1);
    }
};    // 여기까지만 적용됩니다.

// 따라서 외부에 함수 정의를 구현할 때는,
// 다시 template <typename T>를 써줘야 합니다.
  • 2016년 10월 15일에 작성됨
    C++, C# 좋아합니다.

  • 늘 감사합니다!    이혁준   2016.10.15 17:46     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close