2

함수 템플릿에 대한 전문화를 선언하고 나중에 소스 파일에 정의하려고합니다. 다음 예를 고려 : 두 변종 잘 컴파일하지만,템플릿 함수의 특수화 선언 및 정의가 다릅니다. 멤버 및 비회원 함수의 동작이 다릅니다.

.hpp

// approach #1 
template <typename T> const char *GetTypeName(); 
template <> const char *GetTypeName<int>(); 

// approach #2 
template <typename T> class TypeName {static const char *Get();}; 
template <> const char *TypeName<int>::Get(); 

.cpp

// approach #1 
template <> const char *GetTypeName<int>() 
{ 
    return "int" 
} 

// approach #2 
template <> const char *TypeName<int>::Get() 
{ 
    return "int" 
} 

MSVC 2012 년 (CTP는 하지 설치됩니다) 비회원 변형 (# 1) 링커 오류를 일으킨다 (해결되지 않은 외부, blah). 정상적인 행동입니까? MSVC 특정? 컴파일러 버그? CTP에서 수정 되었습니까?

수정
나는 특수 버전 만 사용하고 있습니다. 그것들은 헤더에서 선언되고 소스에서 정의됩니다. 이 접근 방식은 구성원에 대해서는 작동하지만 독립 실행 형 기능에는 작동하지 않습니다.

편집 2
흠 ... 내가 집에서 (동일한 MSVC 설치, 아니 CTP)을 같은 스냅 샷을 구축하기 위해 노력하고있어, 그것이 문제없이 연결합니다. 로컬 버그 또는 손상된 설치와 같습니다.

+0

되지 않은 외부? 같은 DLL 또는 다른 DLL에서 사용합니까? –

+0

@JamesKanze 비회원 전문화를위한 확인되지 않은 외부. 나는 전용 버전만을 사용하고 있습니다. 독립 실행 형 응용 프로그램, DLL 없음. –

+0

그리고 전문화 된 구현의 소스 파일은 프로젝트의 일부입니까? –

답변

2

함수 템플리트는 함수가 아닙니다. 완전히 특수화 된 함수 템플릿 함수입니다.

모든 (odr-used) 기능을 정의해야하기 때문에 임의의 템플리트 인스턴스화에 대한 정의를 생성 할 수있는 방법이 있어야합니다. 따라서 기본 함수 템플리트의 정의는 헤더에 있어야합니다.

header.h가 :

template <typename T>   // this 
const char * GetTypeName()  // is 
{        // not 
    return "foo";    // a 
}        // function 

template <> 
const char * GetTypeName<int>(); 

impl.cpp : 전문 분야, 또는 무엇에 대한

#include "header.h" 

template <> 
const char * GetTypeName<int>() 
{ 
    return "int"; 
} 
+0

하지만 전문 버전 만 사용할 계획입니다. 이 경우에도 함수 템플릿에 대한 정의를 제공해야합니까? –

+0

@ShadowsInRain 아니요. 컴파일러는 사용하는 인스턴스화에 대한 정의 만 필요합니다. 특수화 된 버전 만 사용하는 경우, 필요한 유일한 정의입니다. –

+0

@JamesKanze 그리고 그렇습니다. 특수 버전 만 사용하고 있으며, 헤더로 선언되고 소스에 정의되어 있습니다. –