C++/C++

템플릿(template) 사용 시 typename 사용 법

Elan 2021. 6. 7. 00:22

템플릿 매개변수에 종속된 것을 일컬어 dependent name 또는 nested dependent name이라고 한다.

- C++ 표준에 따라 dependent name 중 typename이 붙지 않은 것은 무조건 변수나 함수로 간주한다.

  즉, typename 뒤 식별자가 타입이라는 것을 명시한다.

template <class T>
class MyClass{
	// typename이 없으면 T::SubType이 타입이라는 것을 식별하지 못해 컴파일 에러 발생
    typename  T::SubType * ptr; 
};

 

- 다음을 위해서는 T 대입되는 클래스 내부에 반드시 다음 문장을 포함해야 한다.

typedef int SubType; //또는

class SubType;

 

 - 예외는 다음과 같다.

 1. 의존 이름이 상속되는 base 클래스 리스트에 있을 

 2. 의존 이름이 멤버 초기화 리스트에 있는 base 클래스의 식별자일때.

 

template<typename T>

class Derived :  public Base<T>::Nested //base 클래스 리스트에 있을   - 자동으로 타입으로 인식 - typename 붙이면 안되

explict Derived(int x) : Base<T>::Nested(x)  //멤버 초기화 리스트에 있는 base 클래스의 식별자 - 자동으로 변수로 인식 - typenmae 붙이면 안됨

{

typename Base<T>::Nested temp; //자동으로 타입으로 인식되지 않음 - typename 붙여야 

}

};