假设:
template <typename T>
class C {
C & operator ++ () { ... }
};
为什么/ C
如何允许声明C
类型的变量和函数而不是名称C<T>
?在制作一个带有许多参数的模板之前我还没有真正考虑过它,这些参数会使拼写出“自我类型”不方便。
我应该知道这有什么怪癖吗?
答案 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>