컴퓨터 언어/C++

template keyword: class vs typename

redsiwon 2020. 7. 25. 11:53

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