class가 type parameter를 지정하는 legacy이고 typename이 후발주자인데,
대부분의 경우 서로 통용이 되지만, typename만 가능한 경우가 있다.
대표적으로 scope operator:: 인데,
template type parameter에 대해 scope operator를 사용하면
type member와 static data member를 구분하지 못한다.
예를 들어,
std::string::size_type 하면 size_type은 type이다.
define 되어있어서 컴파일러가 볼 수 있다. 즉 구분할 수 있다.
그런데 만약에,
type parameter T에 대한 T::size_type는
T가 instantiation 되기 전까지 size_type이라는 name의 정체를 컴파일러가 알 수 없다.
다시 예를 들어,
T::size_type * p 라는 expression이 있으면,
T::size_type이라는 type에 대한 pointer p를 선언하는 것인지
T::size_type이라는 static data member와 p를 곱하는 것인지
컴파일러가 구분할 수가 없다는 것이다.
default로, type parameter T에 대해서 T::size_type은 type으로 간주되지 않는다.
따라서 size_type이라는 name이 type이라는 사실을 명시해주어야 하는데
이때 typename keyword를 사용하여 typename T::size_type 이라고 명시하면 이것은 type으로 간주된다.
이러한 경우에는 typename 대신에 using을 사용할 수 없다.
참고자료: C++ Primer 5th, 669~670p
'컴퓨터 언어 > C++' 카테고리의 다른 글
C++ / initialization of private static member, static function pointer (2) | 2020.07.29 |
---|---|
Primitive Built-In Types (0) | 2020.07.23 |
Copy vs Move Constructor/Assignment (0) | 2020.07.15 |