-
Effective C++...40일지 2022. 8. 16. 20:47
typename의 두 가지 의미를 제대로 파악하자
typename의 첫 번째 의미
템플릿 선언문에서 타입 매개변수를 선언할 때 class와 typename이 동등하게 사용된다.
template<class T> class Widget;
template<typename T> class Widget;
템플릿 내부에서 사용되는 타입 종류
템플릿 내부에서 타입 매개변수에 의존되는 타입과 타입 매개변수에 독립된 타입이 존재한다.
- 중첩 의존 타입 이름(nested dependent type name) T::const_iterator같이 타입 매개변수 T에 의존하는 타입
- 비의존 이름(non-dependent type name) int와 같이 T와는 독립적으로 존재하는 타입
typename의 두 번째 의미
기본적으로 컴파일러는 중첩 의존 타입 이름이 등장하면 이를 타입이 아닌 것으로 해석한다.
다음과 같은 코드가 있을 때 다음의 내용을 변수의 곱으로 해석한다는 것이다.
C::const_iterator * x; // C의 const_iterator라는 변수와 x의 곱으로 해석된다.
컴파일러에게 중첩 의존 타입 이름이 타입이라는 것을 전달하기 위해 typename을 사용한다.
typename C::const_iterator * x; // C::const_iterator의 포인터 x를 선언한다.
주의할 점은 기본 클래스의 리스트 또는 멤버 초기화 리스트의 기본 클래스 식별자는 typename을 붙이지 않는다는 것이다.
template<typename T>
class Derived : public Base<T>::Nested {
public:
explicit Derived(int x)
: Base<T>::Nested(x)
{
typename Base<T>::Nested temp;
}
};
※ 컴파일러에 따라 중첩 의존 타입 이름의 규칙 강도가 다를 수 있다.