2010-02-20 38 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 2010-02-20 04:47:10

+0

我在问什么模板<>是。 – Tom 2010-02-20 04:56:10

+0

这只是用来说“这是一个模板类,但我不需要任何模板”的语法,因为你会自己填充它。 – GManNickG 2010-02-20 04:59:56

回答

7

这就是专业化。例如:

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

此模板将有is_void<T>::valuefalse任何类型,这显然是不正确。你可以做的就是使用这个语法说:“我T中填充我自己,专业”:

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>::value是除了当Tvoidfalse。然后编译器选择更专用的版本,我们得到true

因此,在你的情况下,它有一个auto_ptr的通用实现。但是这种实现在void上有问题。具体而言,它不能被解除引用,因为它没有与之相关的类型。

所以我们可以做的是专门0123Åvoid变种删除这些功能。

+0

谢谢,非常好的解释。 – Tom 2010-02-20 05:03:38