문제 해결

[C++] template, typename, class 키워드

토아드 2017. 7. 12. 16:17
반응형

졸업과제 프로젝트를 하던 중 이해가 잘 안가는 문법이 발견되었다.


1
2
3
4
5
6
7
8
template <typename Graph>
size_t generateAdjacency(Graph* seqCollection)
{
    typedef typename graph_traits<Graph>::vertex_descriptor V;
    typedef typename Graph::Symbol Symbol;
    typedef typename Graph::SymbolSet SymbolSet;
...
}
cs


template 문법은 알고 있었지만 typename이라는 부분이 이해가 잘 가지 않았다. 여러 포스트들을 둘러 본 결과 typename은 다음과 같은 의미를 가진다


1. template 선언 시 class 대신에 사용할 수 있는 키워드

 이 경우에는 인자로 들어오는 변수가 클래스 타입이 아닐 수도 있는데 이 경우 typename을 사용하여 class보다 더 높은 확장성을 제공하는 듯 하다. 위 코드 1번 라인을 보면 이와 같이 사용하고 있다.


2. :: 연산자를 사용 할 때 명확성을 위해서

 위 코드의 4~6번 코드를 보면 Graph::Symbol 이라는 코드를 볼 수 있는데 전체 코드상으로 class인것을 알 수 있지만, 이 부분만을 보면 이것이 Graph의 class인 Symbol인지, Graph의 전역멤버변수인지 알 수가 없다. 이럴 때 typename 이라는 키워드를 앞에 써 주면 '이것은 멤버가 아닌 클래스 타입이다' 라고 명시를 해 주는 것이다.

 더 쉽게 이해하기 위해 다음과 같은 예를 들어보았다.


1
2
3
School::Student *student;
School::penalty *studentAge;
 
cs


 이 코드에서는 두줄의 코드가 모두 같은 형태로 작성되어 있다. 근데 여기서 Student는 School 내에 선언된 클래스이고, penalty는 School 내에 선언된 전역 멤버변수인 경우 첫번째 코드는 Student 포인터를 생성하는 결과를 내고, 두번째 같은 경우 두 변수의 곱을 해주는 결과를 낸다. 이런 혼동을 막기 위해 typename이라는 키워드를 쓰는 것이다.





*지적 및 의견 환영합니다

반응형