2010-02-20 4 views
3

나는 (재미와 매우 유용한 모두 밝혀졌다)에 STL 소스 코드를 읽고 있었다, 나는특수화하지 않고 템플릿 <>을 사용하는 이유는 무엇입니까?

//file backwards/auto_ptr.h, but also found on many others. 

template<typename _Tp>                         
     class auto_ptr 

//Question is about this: 
template<> 
    class auto_ptr<void> 

template<> 부분은 클래스의 중복을 피하기 위해 추가됩니다 이런 종류의 일을 우연히 만났다?

+0

제목이 혼란 스럽습니다. 정확히 무엇을 의미합니까? – GManNickG

+0

<> 템플릿이 무엇인지 묻고 있습니다. – Tom

+0

"이것은 템플릿 클래스입니다.하지만 템플릿이 필요 없습니다"라고 말하는 데 사용되는 구문입니다. 사용자가 직접 채울 것이기 때문입니다. – GManNickG

답변

7

전문 분야입니다. 이 템플릿은 분명히 잘못 is_void<T>::value에 대한 false 같은 유형을 것

template <typename T> 
struct is_void 
{ 
    static const bool value = false; 
}; 

예를 들면 다음과 같습니다.

template <> // I'm gonna make a type specifically 
struct is_void<void> // and that type is void 
{ 
    static const bool value = true; // and now I can change it however I want 
}; 

지금 is_void<T>::valueTvoid 인 경우를 제외하고 false입니다 : 당신이 할 수있는 것은 "나는 T에 자신을 충전하고, 전문거야"말을이 구문을 사용합니다. 그런 다음 컴파일러가보다 특수화 된 버전을 선택하면 true이됩니다.

따라서 귀하의 경우 일반 구현이 auto_ptr입니다. 하지만 그 구현은 void에 문제가 있습니다. 특히 연관된 유형이 없으므로 역 참조 할 수 없습니다.

그럼 우리가 할 수있는 일은 해당 기능을 제거하기 위해 변형 auto_ptr을 전문적으로 적용하는 것입니다.

+0

고맙습니다. 설명이 잘되어 있습니다. – Tom

관련 문제