일지

Effective C++...40

niamdank 2022. 8. 16. 20:47

typename의 두 가지 의미를 제대로 파악하자

typename의 첫 번째 의미

템플릿 선언문에서 타입 매개변수를 선언할 때 classtypename이 동등하게 사용된다.


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;

    }

};


 

※ 컴파일러에 따라 중첩 의존 타입 이름의 규칙 강도가 다를 수 있다.