2013-04-18 32 views
0

我目前正在学习C++模板,有些东西我不明白。到目前为止,我明白,如果你有以下的通用类使用模板

template <class T> class A{ 
     ... 
    } 

为客户提供一流的专业化具体,譬如说int对象,您可以定义如下:

template<> class A<int>{ 
     ... 
    } 

不过,我有已经看到类似下面的情况:

原始类,

template <class T, int Size> class buffer{ 
     ... 
    } 

那么对于int类型的对象speciliazed类,

template <int Size> class buffer<int, Size>{ 
     ... 
    } 

我很困惑,为什么int的特化是不是以下:

template<> class bufffer<int, int Size>{ 
     ... 
    } 

能有人请解释。

回答

0

buffer模板有两个模板参数。第一种是类型参数,因为它以class开头,第二种是非类型参数,因为它以int开头。

你所看到的只是第一个参数的部分专业化。请注意,模板特化的模板参数完全独立于原始模板的模板参数(这是我在学习时弄混淆的主要事情之一)。例如,它会工作一样好:

template <int N> class buffer<int, N> { ... }; 

它基本上是给了时buffer的第一个模板参数是类型int,二是一些int值专业化。

无论何时以template <>(空括号)开始,这是一个明确的特化,您可以在其中指定全部模板参数。例如,你可以这样做:

template <> class buffer<int, 1> { ... }; 

这将是在第一个模板参数是int类型,第二是价值1专业化。

+0

这很有道理! – Adeeb