【发布时间】:2015-01-16 08:21:12
【问题描述】:
在我看来,C++ 编译器甚至在模板被实例化之前就对其进行了解析。否则,这不能解释使用关键字 typename 将依赖名称声明为类型。换句话说,如果编译器仅在实例化时解析模板定义,我认为解释没有歧义
template < typename Foo >
struct ABC {
Foo::iterator * i;
}
因此在 Foo::iterator 之前不需要 typename。
因此,我认为编译器会在实例化之前解析定义(类型 Foo 是已知的)。问题是,它为什么这样做?为什么不延迟到它被实例化并且所有类型都已知。
【问题讨论】:
-
问题是“哪个编译器”。但总的来说,这是一个很好的主题阅读:blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html 和“为什么”部分:eli.thegreenplace.net/2012/02/06/…
-
您所描述的内容听起来像是预处理器宏。我想很多人都很高兴模板提供了更强大的抽象。
-
@PeterT:那篇文章涵盖了“为什么”需要第 2 阶段,但问题是为什么存在第 1 阶段。