如果我写的话,那个titlen几乎说了所有;
vvvvv
template <template <typename, typename> class StdContainer, typename T>
class DerivedContainer: public StdContainer<T, std::allocator<T>>
{ /*...*/ };
为什么需要class关键字?这是允许使用typename的时候,作为所有其他模板上下文中的替换。消除歧义?标准的哪一部分说明了这一点?
请注意;我不是从std容器派生的,这只是一个例子。
答案 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
。