为什么这个类定义中不需要空的参数列表
Why is no empty argument list required inside this class definition?
当仅使用标准类型参数实例化具有模板化类类型的变量时,语法如下:
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>
,因此不一定相同(。
- 概念中的cv限定符需要表达式参数列表
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- 错误 没有与参数列表匹配的重载函数"getline"实例
- std::vector 没有重载函数的实例与参数列表匹配
- 模板参数列表中的 false 在模板初始化期间计算为什么?
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- 构造函数/函数声明参数列表中的统一初始化
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 带有整数的变量参数列表
- 转发变量参数列表以模拟 std::thread
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- C++-将具有引用的长参数列表重构为结构
- 缺少别名模板C++参数列表
- C++如果两个模板函数都与参数列表匹配,将调用哪个模板
- "extern"声明以及带有和不带参数列表的类模板实例的后续定义
- 使用显式模板参数列表和 [temp.arg.explicit]/3 的函数调用的演绎失败
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- 我可以使用宏自动构建参数列表吗?
- 类成员函数参数列表是否可以依赖于模板参数?