编译器在编译模板类时使用两阶段查找意味着什么?
编译器在编译模板类时使用两阶段查找意味着什么?
模板至少被编译两次:
在未实例化时,模板代码本身会被检查语法。
例如: 任何语法错误如 ;
等。
在实例化时(当确切的类型已知),模板代码再次被检查以确保所有调用对于该特定类型都是有效的。
例如: 模板可能反过来调用函数,但这些函数可能不存在于该特定类型中。
这称为两阶段查找。
sqrt(1)
,则需要在定义模板之前声明 sqrt
。但如果您调用 sqrt(t)
,其中 t
是类型参数的实例,则无需在实例化模板之前看到 sqrt
。MSVC 以前无法正确执行此操作:我不知道现在是否还存在这个问题。 - Steve Jessop::sqrt(::NS::A)
不会被找到,因为额外的查找将在 ::NS
中进行而不是 ::
中。最后一个要点是,别名、typedef 或 using 的作用域不会被搜索,只有被别名的类型本身的作用域会被搜索。 - Richard Corden