#include <iostream>
using namespace std;
// typename 문법이야기
// 1.2 의 중복문제가 발생해서 이를 해결하고자 typename 키워드를 만들었다.
// 그러고 보니 class T 라는 것의 의미가 명확하지가 않는 것을 알 수가 있었다.
// class T는 int와 같은 타입도 받을 수 있기 때문에 typname으로 바뀌게 된 것이다.!!!
// 하지만 class는 여전히 지원된다.
template<typename T> void foo( T a )
{
        typename T::B* p;
        // 1. T안에 내포클래스로 B가 있는데 그 포인터 p를 선언.
        // 2. T안에 B라는 static 변수가 있는데 곱하기 p를 한다.
}
class A
{
public:
        static int B;
        class B
        {
        };
};
void main()
{
        A a;
        foo( a );
}
//////////////////////////////////////////////////////////////////// 
// 디폴트 인자
template<typename T = int, int n = 10> class Stack
{
        T buf[n];
};
void main()
{
        Stack<int, 10> s;
        Stack<int> s2;
        stack<> s3;    // 모두 default 사용
}
