C++의 typename 키워드

Suraj P 2023년10월12일
  1. C++의 규정된 이름 및 규정되지 않은 이름
  2. C++의 종속 및 비종속 이름
  3. C++에서 typename 키워드 사용
C++의 typename 키워드

이 기사에서는 C++의 typename 키워드에 대해 설명합니다.

typename 키워드의 의미를 이해하려면 qualifieddependent 이름의 주요 개념을 이해해야 합니다.

C++의 규정된 이름 및 규정되지 않은 이름

규정된 이름은 범위를 지정합니다. 더 잘 이해하기 위해 예를 들어 보겠습니다.

#include <bits/stdc++.h>

int main() { std::cout << "Hello world!" << std::endl; }

여기에서 coutendl에 대한 참조는 정규화된 이름입니다. 그러나 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 키워드는 SubTypeT 클래스의 유형임을 컴파일러에 알려줍니다. 즉, myptr 포인터는 T::SubType 유형입니다.

typename 키워드가 없으면 SubType은 정적 멤버로 간주되고 컴파일러는 T 유형의 SubType과 포인터 myptr을 곱한 것으로 평가합니다.

T::SubType * myptr //compiler will think it's multiplication

위 코드에서 typename 키워드를 사용하지 않으면 컴파일러가 T::SubType이 유형 이름을 참조하는지 아니면 정적 멤버 T를 참조하는지 알지 못하기 때문에 컴파일 시간 오류가 발생합니다.

작가: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub