为什么这个类定义中不需要空的参数列表

Why is no empty argument list required inside this class definition?

本文关键字:参数 列表 不需要 定义 为什么      更新时间:2023-10-16

当仅使用标准类型参数实例化具有模板化类类型的变量时,语法如下:

template<typename Arg = int>
class Templ;
Templ<>& myTempl;

省略空参数列表<>应该会导致编译错误,因为需要模板参数列表。

但显然(至少在VS2013下(,以下声明不需要模板参数列表:

template<typename Arg> //" = int" left out
class Templ{
    Templ& myTempl; //no <> here
};

但为什么这样做呢?根据IntelliSense的说法,编译器选择了正确的类型(Templ<int>(,因此它可以按预期工作,但成员声明不应该仍然需要一个空的参数列表吗?

编辑:不,它没有按预期工作。我检查得不够彻底。将鼠标悬停在Templ<short>::myTempl线上时,IntelliSense显示其类型为short

类名被注入类作用域

9类[class]

2类名被插入到声明它的作用域中在看到类名之后立即显示类名也是插入到类本身的范围中;这被称为注入的类名。为了进行访问检查注入的类名被视为公共成员名。A.类说明符通常被称为类定义。A级被认为是在其类说明符的右大括号之后定义的尽管其成员职能总体上还没有定义可选的属性说明符seq属于类;属性说明符seq中的属性如下无论何时命名,都考虑类的属性。

类似地,对于类模板

14.6.1本地声明的名称[temp.local]

1与普通(非模板(类一样,类模板具有注入的类名(第9条(。injected类名可以用作模板名称或类型名称。当它与模板参数列表,作为模板的模板参数模板参数,或作为详细阐述了友元类模板声明的类型说明符,它引用类模板本身否则,相当于类的模板参数后面的模板名称CCD_ 5中包含的模板

以便您可以使用Templ,这里您指的是Templ<Arg>

这被称为注入的类名

在类模板中,没有任何模板参数列表的模板的名称指的是当前实例化,因此Templ表示Templ<Arg>(并且不是Templ<>,它是Templ<int>,因此不一定相同(。