C ++编译器在实例化之前解析模板?为什么?

时间:2014-11-18 23:38:30

标签: c++ templates

在我看来,C ++编译器甚至在实例化之前就会解析模板。否则,这不能解释使用关键字typename将依赖名称声明为类型。换句话说,如果编译器仅在实例化时解析模板定义,我不认为解释存在歧义

template < typename Foo >
struct ABC {
    Foo::iterator * i;
}

因此在Foo :: iterator之前不需要typename。

因此,我认为编译器在实例化之前解析该定义(类型Foo已知)。问题是,为什么会这样做?为什么不延迟直到它被实例化并且所有类型都已知。

2 个答案:

答案 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