Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+的两阶段名称查找+;模板-为什么? 为什么C++标准定义了两个阶段的模板查找?非依赖声明和定义的查找不能也推迟到实例化阶段吗?_C++_Templates_Name Lookup_Dependent Name - Fatal编程技术网

C+的两阶段名称查找+;模板-为什么? 为什么C++标准定义了两个阶段的模板查找?非依赖声明和定义的查找不能也推迟到实例化阶段吗?

C+的两阶段名称查找+;模板-为什么? 为什么C++标准定义了两个阶段的模板查找?非依赖声明和定义的查找不能也推迟到实例化阶段吗?,c++,templates,name-lookup,dependent-name,C++,Templates,Name Lookup,Dependent Name,这可以看作是的一个应用程序 在第一阶段,它只检查语法是否正确,并解析非依赖名称,如前所述。在第二阶段,它会做一些更特定于模板的事情,验证调用是否对特定类型有效。看到这个[答案]() 此外,如果它只在一个阶段中完成,那么它应该在每个实例化中完成。这种方法只做一次 如果只在第一次实例化时执行,那么它将是相同的事情,只是结构更少。他们可以。这是大多数早期模板实现的方式 工作,并且仍然是微软编译器的工作方式。感觉到了 (在委员会中)这太容易出错;这让我们很容易 意外劫持一个名称,并在一个翻译中实例化 单

这可以看作是的一个应用程序

在第一阶段,它只检查语法是否正确,并解析非依赖名称,如前所述。在第二阶段,它会做一些更特定于模板的事情,验证调用是否对特定类型有效。看到这个[答案]()

此外,如果它只在一个阶段中完成,那么它应该在每个实例化中完成。这种方法只做一次


如果只在第一次实例化时执行,那么它将是相同的事情,只是结构更少。

他们可以。这是大多数早期模板实现的方式 工作,并且仍然是微软编译器的工作方式。感觉到了 (在委员会中)这太容易出错;这让我们很容易 意外劫持一个名称,并在一个翻译中实例化 单元拾取本地名称,而不是所需的全局符号。(一) 典型的翻译单元将包括一系列的
#include
s, 声明每个人都应该看到的名称,然后是实现 代码。在实例化点,在实例化点之前的所有内容 实例可见,包括实现代码。)

最后的决定是将模板中的符号分为两类 类别:依赖和非依赖,并坚持 非相关符号将在定义时解析 模板,以减少它们意外绑定到某些 本地实现符号。再加上规定的要求
typename
template
如果适用于从属符号,则 还允许在定义点进行解析和一些错误检查
而不仅仅是当模板被实例化时。

+1-这是对标准中给出的定义背后的推理的一个很好的解释,谢谢!这就是我要找的理由。所以现在本地名(比如非依赖的继承成员函数)可以被全局名劫持。“是吗?”阿尔伯特:是的。坦率地说,我当时(现在也不是)对改进后的解决方案不太感兴趣。部分原因是,它并不能真正解决所有问题;即使在今天,您也需要系统地使用完全限定的名称。另外,因为我发现依赖名称和非依赖名称之间的隐式区别有点棘手:如果确实需要两个不同的查找,那么我宁愿显式指定获得依赖查找的名称,而不是让它依赖于参数,等等@JamesKanze能否请您提供一个适当的例子,说明这将失败?相关:。另外,如果你用谷歌
msvc打破两阶段名称查找
,你会得到更多的例子。