ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Effective C++...40
    일지 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;

        }

    };


     

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

     

    댓글

Designed by Tistory.