2017-11-18 7 views
1

템플릿에 대해 읽은 후 컴파일에 대해 혼란 스럽습니다. 우리는 두 개의 소스 파일이 템플릿을 사용여러 개의 오브젝트 파일에서 C++ 템플릿 및 컴파일

template<typename T> 
class Object { 
public: 
    Object(); 
    void hashCode(T& arg){ /* implementation code in header-only. */ } 
}; 

- - 예를 들어, 헤더에 우리는 다음과 같이 템플릿 정의 포함하여 SourceI.cpp & SourceII.cpp을 Object.hpp -

SourceI.cpp

void doSomething() 
{ 
    Object<int> intHasher; 
    intHasher.hashCode(); 
    // Further code... 
} 

SourceII.cpp이

void doNothing() 
{ 
    Object<int> notUsedHere; 
    notUsedHere.hashCode(); 
} 

컴파일 생성한다 int 형의 클래스 인스턴스화의 코드. 오브젝트 <int> 유형에 대해 코드가 저장됩니다. 또는 객체 <:: hashCode()의 코드가 모든 용도로 인라인 될 것입니까?

코드가 인라인되지 않은 경우 심볼 충돌은 여러 오브젝트 파일에 존재하기 때문에 연결되지 않습니까?

참고 -이 코드는 예제를 제공하기위한 것이며 목적을 나타내지 않습니다.

+0

관련 : https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – user0042

답변

1

이 파일을 컴파일하면 SourceI.cpp와 SourceII.cpp 모두 Object < int> 복사본을 갖게됩니다. 이를 코드 팽창 (bloating bloating)이라고하며 템플릿 사용시 단점 중 하나입니다.

이 링크를 연결하면 링커에서 Object < int>의 인스턴스화가 동일하고 하나만 제외하고 모두 버릴 것으로 가정합니다.

+2

그럼 ... 결점 (이 경우)은 결국 없습니다. –

+0

링커가 결국 C++ 템플릿에 대해 알아야한다는 것을 의미합니까? –

+0

또한 미리 컴파일 된 헤더가 사용 중입니다. –