프로그래밍C++ 개발자

C++에서 템플릿이란 무엇인가요? 어떤 종류의 템플릿이 존재하나요? 템플릿 설계 및 사용 시 어떤 어려움과 오류가 발생하나요? 클래스 템플릿과 함수 템플릿의 예를 보여주세요.

Hintsage AI 어시스턴트로 면접 통과

답변.

템플릿 — C++의 메커니즘으로, 다양한 데이터 유형에서 작동하는 일반화된 클래스와 함수를 코드 중복 없이 생성할 수 있게 해줍니다. 이는 STL의 컨테이너, 알고리즘 및 많은 일반화 프로그래밍 패턴의 구현의 기초입니다.

템플릿의 종류:

  • 함수 템플릿: 다양한 유형에 대해 하나의 함수를 생성할 수 있게 해줍니다.
  • 클래스 템플릿: 다양한 유형과 함께 작동하는 클래스를 생성할 수 있게 해줍니다.
  • 값 매개변수를 가진 템플릿: 유형뿐만 아니라 상수 값으로 매개변수화할 수 있습니다.

클래스 템플릿 예:

template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };

함수 템플릿 예:

template<class T> T add(const T& a, const T& b) { return a + b; }

트릭 질문.

템플릿 클래스에서 전체 클래스를 전문화하지 않고 하나의 메서드만 명시적으로 전문화할 수 있나요? 가능하다면, 어떻게 하나요?

답변:
네, 가능합니다. 전체 클래스를 전문화할 필요는 없으며, 개별 메서드만 전문화할 수 있습니다:

template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // int에 대한 bar 메서드의 전문화 // 구현 }

이 주제의 미세한 차이점으로 인해 발생하는 실제 오류 예.


이야기
프로젝트에서 비교를 위한 함수 템플릿이 작성되었습니다:

template <typename T> bool cmp(const T& a, const T& b) { return a < b; }

< 연산자를 가지지 않는 유형과 함께 사용할 때 컴파일 오류가 발생했고, 이는 템플릿이 인스턴스화될 때만 진단 정보가 제공되어서 오랜 시간 동안 찾는데 어려움을 겪었습니다.


이야기
개발자가 사용자 정의 클래스에 대해 사용자 정의 함수 템플릿에서 덧셈을 사용하려 했으나 + 연산자를 오버로드하는 것을 잊어버렸습니다. 이는 해당 클래스와 함께 호출될 때 컴파일 오류를 초래했습니다.


이야기
클래스 템플릿을 기반으로 하는 컨테이너를 개발하는 과정에서 템플릿 유형에 의존하지 않는 메서드를 작성했으나, 명시적으로 전문화하지 않고 클래스 외부로 추출하였습니다:

template<> int MyContainer<int>::size() const { ... }

이는 전문화가 선언되었으나 모든 유형에 대해 제대로 구현되지 않아 링커 오류를 발생시켰습니다.