Xya*_*and 27 c++ templates dependent-name name-lookup
为什么C++标准为模板定义了两个阶段查找?非依赖声明和定义的查找是否也可以推迟到实例化阶段?
Jam*_*nze 33
他们可以.这是大多数早期模板实现的方式,并且仍然是Microsoft编译器的工作方式.(委员会)认为这太容易出错; 它使得偶然劫持一个名称变得太容易了,一个翻译单元中的实例化获取了一个本地名称,而不是所需的全局符号.(典型的翻译单元将由一系列#includes组成,声明每个人都应该看到的名称,然后是实现代码.在实例化时,即时点之前的所有内容都是可见的,包括实现代码.)
最后的决定是将模板中的符号分为两类:依赖符号和非依赖符号,并坚持在模板定义点解析非依赖符号,以降低他们意外受约束的风险一些本地实现符号.结合指定的要求
typename以及template何时适用于依赖符号,这还允许在模板定义时进行解析和一些错误检查,而不仅仅是在实例化模板时.