C++ class template
조회수 1618회
#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 를 필수 적으로 써줘야 하나요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
네. 반드시 써줘야 합니다.
왜냐면 함수를 정의할 때, '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>를 써줘야 합니다.
댓글 입력