#include <iostream>

using std::cin;
using std::cout;
using std::endl;

enum PT_BASE : int {};

enum PT : int {		// enumeration
  First = 1,		// enumerator
  Second,			// enumerator
};
//enum PT : int {	// error: 같은 이름의 enum type ('PT')의 중복 정의 안됨.
//	A = 11,
//	B,
//};

enum struct T1 : int {
  num = 1
};
enum struct T2 : int {
  num = 2
};

enum A1 : int {
  a1
};
enum A2 : int {
  //a1 = 2,	// error: 'a1 재정의 오류'
        //  enum type이 달라도 같은 이름의 value 가질 수 없음
  a2
};

void foo(int i) { cout << i << endl; }

void fooEnum(PT pt) { cout << pt << endl; }

void foo(T1 val) { cout << "T1" << endl; }
void foo(T2 val) { cout << "T2" << endl; }

void fooA(int val) { cout << "int" << endl; }
void fooA(A1 val) {	cout << "A1" << endl; }
void fooA(A2 val) { cout << "A2" << endl; }

int main()
{
  // case1: enum:int는 int로 간주됨
  cout << endl << "Case 1" << endl;
  cout << PT::First << endl;	// output: 1
  cout << PT::Second<< endl;	// output: 2
  
  // case2: enum type을 인수로 받는 함수에 int를 넣을 시 에러.
  cout << endl << "Case 2" << endl; 
  foo(PT::First);	// output: 1
  //fooEnum(1);	// error 'int'형식이 'PT'형식과 호환되지 않습니다.'

  // case3: enum struct test
  cout << endl << "Case 3" << endl;
  //foo(T1);	// error '형식 이름을 사용할 수 없습니다.'
  foo(T1::num);	// output: T1
  foo(T2::num);	// output: T2

  // case4: enum test. 
  cout << endl << "Case 4" << endl;
  foo(A1::a1);	// output: 0
  fooA(A1::a1);	// output: A1
  fooA(A2::a2);	// output: A2
  //fooA(1);	// error '인수 목록이 일치하는 오버로드된 fooA가 없습니다.'

  return 0;
}