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 붙여야 함
}
};