在我看来,C ++编译器甚至在实例化之前就会解析模板。否则,这不能解释使用关键字typename将依赖名称声明为类型。换句话说,如果编译器仅在实例化时解析模板定义,我不认为解释存在歧义
template < typename Foo >
struct ABC {
Foo::iterator * i;
}
因此在Foo :: iterator之前不需要typename。
因此,我认为编译器在实例化之前解析该定义(类型Foo已知)。问题是,为什么会这样做?为什么不延迟直到它被实例化并且所有类型都已知。
答案 0 :(得分:4)
在我看来,C ++编译器甚至在实例化之前就会解析模板。
这是它的工作。它是一个编译器,而不是宏处理器。
如果编译器仅在实例化时解析模板定义,我不认为解释存在歧义
一个问题是模板本身的错误不会被检测到,只要它只用友好的方式实例化即可。不会触发错误的类型:例如,如果模板假定类型始终具有这样的方法。
答案 1 :(得分:0)
CRTP将成为一个问题。简而言之,这是合法的:
template <typename T> struct Base { };
struct Derived : Base<Derived> { };
显然,如果Base<Derived>
只能在编译Derived
后编译,我们就会遇到问题,因为Derived
只能在编译Base<Derived>
后编译。然而,Base<T>
的第1阶段编译足以编译Derived
。