模板模板参数,为什么强制类?

时间:2014-01-24 13:29:08

标签: c++ templates

如果我写的话,那个titlen几乎说了所有;

                                        vvvvv
template <template <typename, typename> class StdContainer, typename T>
class DerivedContainer: public StdContainer<T, std::allocator<T>>
{ /*...*/ };

为什么需要class关键字?这是允许使用typename的时候,作为所有其他模板上下文中的替换。消除歧义?标准的哪一部分说明了这一点?

请注意;我不是从std容器派生的,这只是一个例子。

2 个答案:

答案 0 :(得分:4)

在声明模板模板参数时,关键字class的使用是由语法强制执行的:

n3337,§14.1[temp.param]:

  

1模板参数的语法是:

     

template-parameter:

     
    

type-parameter
    parameter-declaration

  
     

type-parameter:

     
    

class ...opt identifier opt
    class identifier opt = type-id
    typename ...opt identifier opt
    typename identifier opt= type-id
    template < template-parameter-list > class ...opt identifier opt
    template < template-parameter-list > class identifier opt = id-expression

  

我不知道确切的原因。当你有一个简单的类型参数时,类型可以是从基本类型到用户声明的类,类模板的特化等等。当它是模板模板参数时,它只能是类模板的名称< / em>的。也许他们想要强调这种差异 - 或许他们只是不打扰在语法中插入更多的行并增加混乱。谁知道:)。

答案 1 :(得分:1)

class有两个含义:声明一个类(或类模板),或声明一个模板类型参数。

typename可以替代第二个含义,但不能替代第一个含义。在模板模板参数中,您要声明一个类模板,因此必须使用class