C++의 typename 키워드
이 기사에서는 C++의 typename
키워드에 대해 설명합니다.
typename
키워드의 의미를 이해하려면 qualified
및 dependent
이름의 주요 개념을 이해해야 합니다.
C++의 규정된 이름 및 규정되지 않은 이름
규정된 이름은 범위를 지정합니다. 더 잘 이해하기 위해 예를 들어 보겠습니다.
#include <bits/stdc++.h>
int main() { std::cout << "Hello world!" << std::endl; }
여기에서 cout
및 endl
에 대한 참조는 정규화된 이름입니다. 그러나 using
선언, 즉 using namespace std
를 사용하여 둘 다 범위로 가져오고 cout
만 단독으로 사용하면 std::
가 없기 때문에 unqualified
이름이 됩니다.
C++의 종속 및 비종속 이름
종속 이름은 템플릿
매개변수에 따라 달라지는 이름입니다.
더 잘 이해하기 위해 샘플 코드를 살펴보겠습니다.
template <class T>
class MyClass {
int i;
vector<int> vi;
vector<int>::iterator vitr;
T t;
vector<T> vt;
vector<T>::iterator viter;
}
처음 세 선언은 템플릿 선언 시 유형이 알려져 있기 때문에 비종속 이름으로 알려져 있습니다.
반면에 두 번째 선언 세트를 보면 T
, vector<T>
및 vector<T>::iterator
는 종속 이름입니다. 템플릿 매개변수 T
.
C++에서 typename
키워드 사용
일반적으로 typename
키워드는 유형을 참조하는 정규화된 이름 또는 종속 이름 앞에 사용해야 합니다.
따라서 키워드 typename
은 뒤에 오는 식별자가 정적 멤버 변수가 아닌 유형임을 지정하기 위해 도입되었습니다.
class A {
public:
typedef int myPtr;
};
template <class T>
class myClass {
public:
typename T::SubType* myPtr;
}
위의 코드에서 typename
키워드는 SubType
이 T
클래스의 유형임을 컴파일러에 알려줍니다. 즉, myptr
포인터는 T::SubType
유형입니다.
typename
키워드가 없으면 SubType
은 정적 멤버로 간주되고 컴파일러는 T
유형의 SubType
과 포인터 myptr
을 곱한 것으로 평가합니다.
T::SubType * myptr //compiler will think it's multiplication
위 코드에서 typename
키워드를 사용하지 않으면 컴파일러가 T::SubType
이 유형 이름을 참조하는지 아니면 정적 멤버 T
를 참조하는지 알지 못하기 때문에 컴파일 시간 오류가 발생합니다.