C++;编译器在实例化之前解析模板?为什么? P>我觉得C++编译器在实例化之前就对模板进行了解析。否则,这并不能解释使用关键字typename将依赖名称声明为类型。换句话说,如果编译器仅在实例化模板定义时才对其进行解析,我认为解释不会有歧义 template < typename Foo > struct ABC { Foo::iterator * i; } 模板 结构ABC{ Foo::迭代器*i; }

C++;编译器在实例化之前解析模板?为什么? P>我觉得C++编译器在实例化之前就对模板进行了解析。否则,这并不能解释使用关键字typename将依赖名称声明为类型。换句话说,如果编译器仅在实例化模板定义时才对其进行解析,我认为解释不会有歧义 template < typename Foo > struct ABC { Foo::iterator * i; } 模板 结构ABC{ Foo::迭代器*i; },c++,templates,C++,Templates,因此,在Foo::iterator之前不需要typename 因此,我认为编译器在实例化定义(已知Foo类型)之前会对其进行解析。问题是,为什么会这样?为什么不延迟,直到它被实例化并且所有类型都已知 P>我觉得C++编译器在实例化之前就对模板进行了解析。 那是它的工作。它是编译器,不是宏处理器 如果编译器仅在实例化模板定义时才对其进行解析,那么我认为对其进行解释不会有歧义 template < typename Foo > struct ABC { Foo::iterato

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

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

<> P>我觉得C++编译器在实例化之前就对模板进行了解析。 那是它的工作。它是编译器,不是宏处理器

如果编译器仅在实例化模板定义时才对其进行解析,那么我认为对其进行解释不会有歧义

template < typename Foo >
struct ABC {
    Foo::iterator * i;
}
这样做的一个问题是,只要模板本身仅使用不会触发错误的“友好”类型实例化,就不会检测到错误:例如,如果模板假定该类型始终具有某某方法

<> P>我觉得C++编译器在实例化之前就对模板进行了解析。 那是它的工作。它是编译器,不是宏处理器

如果编译器仅在实例化模板定义时才对其进行解析,那么我认为对其进行解释不会有歧义

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

这样做的一个问题是,只要模板本身仅使用不会触发错误的“友好”类型进行实例化,就不会检测到错误:例如,如果模板假定该类型始终具有某某方法。

否则CRTP将是一个问题。简言之,这是合法的:

template <typename T> struct Base { };
struct Derived : Base<Derived> { };
template struct Base{};
派生结构:基{};

显然,如果
Base
只能编译一次
Derived
,我们就会有问题,因为
Derived
只能编译一次
Base
。然而,第1阶段编译
Base
足以编译
派生的

否则CRTP将是一个问题。简言之,这是合法的:

template <typename T> struct Base { };
struct Derived : Base<Derived> { };
template struct Base{};
派生结构:基{};

显然,如果
Base
只能编译一次
Derived
,我们就会有问题,因为
Derived
只能编译一次
Base
。第一阶段编译
Base
足以编译
派生的

问题是“哪个编译器”。但总的来说,这是一本关于这个主题的好书:关于“为什么”部分:你所描述的听起来像预处理器宏。我想很多人都很高兴模板提供了一个更强大的抽象。@PeterT:那篇文章讨论了为什么需要第2阶段,但问题是为什么第1阶段存在。问题是“哪个编译器”。但总的来说,这是一本关于这个主题的好书:关于“为什么”部分:你所描述的听起来像预处理器宏。我想很多人都很高兴模板提供了一个更强大的抽象。@PeterT:那篇文章讨论了为什么需要第2阶段,但问题是为什么第1阶段存在。模板当然可以选择假设它们的类型参数总是有某种方法——完全延迟解析的问题(就像MSVC已经使用了很长一段时间)是模板可能意味着不同的事情,取决于它的参数的成员是类型、模板还是两者都不是。模板当然可以选择假设它们的类型参数总是有某种方法——完全延迟解析的问题(就像MSVC已经使用了很长一段时间)根据其参数的成员是类型、模板还是两者都不是,模板的含义可能不同。