// 클래스 template의 기본.
template <typename T> class Stack
{
        T* buf;
public:
        Stack() {}             // 1. ok. 생성자이름은클래스이름
        //Stack<T>() {}        // 2. 에러
        // 복사생성자의모양
        Stack( const Stack<T>& ) {}
        void push ( T a );
};
// 클래스template의멤버함수를외부에구현하려면
template<typename T> void Stack<T>::push( T a )
{
}
void main()
{
        Stack<int> s1;
//      Stack      s2;  // error. Stack template의이름이지Type이아니다.
                        // type은Stack<T> 이다.
}
// 멤버 함수 template를 활용해보자.!!!
template<typename T> class Stack
{
public:
        Stack(){}
        template<typename U> explicit Stack(const Stack<U>&) 
{
        }
        explicit Stack(const Stack<T>&) 
{
        }
};
void main()
{
        Stack<int> s1;
        Stack<int> s2(s1);
        Stack<int> s3;
        Stack<double> s4(s3);
}