스택큐힙리스트

왜 템플릿은 헤더 파일에서만 구현 가능한가요? 본문

카테고리 없음

왜 템플릿은 헤더 파일에서만 구현 가능한가요?

스택큐힙리스트 2023. 3. 24. 08:15
반응형

The C++ standard library: a tutorial and handbook 에서 인용한 문구:

현재 템플릿을 사용하는 유일한 휴대용 방법은 인라인 함수를 사용하여 헤더 파일에 구현하는 것입니다.

왜 그런 걸까?

(명확화: 헤더 파일은 유일한 이식 가능한 솔루션이 아닙니다. 그러나 가장 편리한 이식 가능한 솔루션입니다.)

헤더 파일은 유일한 이식 가능한 솔루션은 아닙니다. 그러나 그들은 가장 편리한 이식 가능한 솔루션입니다.

답변 1

주의: 구현을 헤더 파일에 넣는 것은 필요하지 않습니다. 이 답변의 대체 솔루션을 참조하십시오.

어쨌든 코드가 실패하는 이유는, 템플릿을 인스턴스화할 때 컴파일러가 지정된 템플릿 인수로 새로운 클래스를 만든다는 것입니다. 예를 들어:

template

struct Foo

{

T bar;

void doSomething(T param) {/* do stuff using T */}

};

// somewhere in a .cpp

Foo f;

이 줄을 읽으면 컴파일러는 새 클래스 (간단히 FooInt로 부르겠습니다)를 생성합니다. 이 클래스는 다음과 같이 표현됩니다.

struct FooInt

{

int bar;

void doSomething(int param) {/* do stuff using int */}

}

결과적으로, 컴파일러는 템플릿 인자(int)로 인스턴스화하기 위해 메서드의 구현에 접근해야 합니다. 이러한 구현이 헤더 파일에 없으면 접근할 수 없으므로 컴파일러는 템플릿을 인스턴스화할 수 없습니다.

이에 대한 일반적인 해결책은 템플릿 선언을 헤더 파일에 작성한 다음 클래스를 구현 파일 (예 : .tpp)에 구현하고 헤더의 끝에서 이 구현 파일을 포함시키는 것입니다.

푸.h

template

struct Foo

{

void doSomething(T param);

};

#include Foo.tpp

Foo.tpp

template

void Foo::doSomething(T param)

{

//implementation

}

이 방법을 사용하면 구현은 여전히 선언과 분리되지만 컴파일러에서 액세스할 수 있습니다.

대안적인 해결책

다른 해결책은 구현을 분리하고 필요한 모든 템플릿 인스턴스를 명시적으로 인스턴스화하는 것입니다.

푸.h

// no implementation

template struct Foo { ... };

푸.cpp

// implementation of Foo's methods

// explicit instantiations

template class Foo;

template class Foo;

// You will only be able to use Foo with int or float

만약 내 설명이 충분히 명확하지 않다면, C++ Super-FAQ on this subject 를 참조해 볼 수 있습니다.

답변 2

템플릿은 C++에서 매우 중요한 개념 중 하나입니다. 이를 사용하면 클래스나 함수를 생성할 때 일부 매개변수를 지정하지 않고 일반적으로 만들 수 있습니다. 하지만 이러한 템플릿은 헤더 파일에서만 구현할 수 있다는 점이 있습니다.

그 이유는 템플릿이 컴파일 타임에 특화되는 성질 때문입니다. 즉, 매번 클래스나 함수를 호출할 때마다 매개변수에 해당하는 실제 타입을 전달해야 하며, 이는 컴파일 타임에 이루어집니다. 따라서 모든 소스 파일에서 모든 가능한 실제 타입을 다루기 위해 템플릿을 반복적으로 정의해야 합니다. 또한, 템플릿은 선언과 구현 사이의 경계를 허용하지 않기 때문에 모든 템플릿 코드는 헤더 파일에서 정의되어야 합니다.

또한, 템플릿을 헤더 파일에 적절하게 정의함으로써 이식성을 보장할 수 있습니다. 컴파일러는 모든 소스 파일들이 동일한 헤더 파일을 사용하고 있음을 보장하기 때문입니다. 이것은 컴파일 타임 오버헤드를 줄이고, 불필요한 타입 변환을 방지하기 때문에 매우 중요합니다.

따라서, 헤더 파일에서 템플릿을 구현하는 것은 C++ 프로그래밍에서 필수적입니다. 이를 헤더 파일에 올바르게 구현함으로써 이식성을 높일 수 있고, 컴파일 타임 오버헤드를 줄일 수 있으며, 불필요한 타입 변환을 방지할 수 있습니다.

반응형
Comments