C ++的哪些特性允许模板类在没有模板参数的情况下引用自己?

时间:2011-11-07 01:19:36

标签: c++ templates

假设:

template <typename T>
class C {
    C & operator ++ () { ... }
};

为什么/ C如何允许声明C类型的变量和函数而不是名称C<T>?在制作一个带有许多参数的模板之前我还没有真正考虑过它,这些参数会使拼写出“自我类型”不方便。

我应该知道这有什么怪癖吗?

3 个答案:

答案 0 :(得分:6)

  

[n3290: 14.6.1/1]:与普通(非模板)类一样,类   模板有一个注入类名(第9条)。该   inject-class-name可用作模板名称类型名称。   当它与 template-argument-list 一起使用时,作为   模板 template-parameter template-argument ,或者作为朋友类的 elaborated-type-specifier 中的最终标识符   模板声明,它指的是类模板本身。   否则,等同于 template-name ,后跟   <>中包含的类模板的模板参数

表面上看,它只是一个便利功能。

答案 1 :(得分:2)

这只是语法糖。

如果您必须更改模板参数,则无需更改方法的签名很方便。

答案 2 :(得分:2)

  

为什么/如何允许C声明C类型的变量和函数而不是命名为C?

它只是这样指定的。模板的名称注入其正文中,表示实际类型(带参数)。

  

我应该知道这有什么怪癖吗?

没什么大不了的。你只需记住这对基类不起作用,所以要做CRTP,你必须这样做

template <class T>
class A : public Base<A<T> > // not Base<A>