两阶段查找 - 需要解释

sma*_*llB 70 c++ templates

编译器使用两阶段查找来编译模板类是什么意思?

Alo*_*ave 62

模板(至少)编译两次:

  1. 在没有实例化的情况下,检查模板代码本身的语法.
    例如:任何语法错误等错误等;.

  2. 在实例化时(当确切类型已知时),再次检查模板代码以确保所有调用对该特定类型有效.
    例如:模板可能会调用对该特定类型可能不存在的函数.

这称为两阶段查找.

  • 另请注意,在第一阶段中查找非依赖名称,而在第二阶段中查找依赖于模板参数的名称.重要的是,如果你调用`sqrt(1)`,那么在定义模板之前需要声明`sqrt`.但是如果你调用`sqrt(t)`,其中`t`是一个模板参数类型的实例,那么在实例化模板之前,`sqrt`不需要可见.MSVC不习惯这样做:仍然可能不是我所知道的. (45认同)
  • 无论如何,这就是为什么它被称为两阶段*查找*而不是仅仅两阶段编译或其他东西.第一阶段应该做的不仅仅是检查语法,但MS在实现第一个查找阶段时遇到了一些困难,因此他们只是在实例化时完成了所有工作:http://stackoverflow.com/questions/6273176/what-exactly-is -broken与 - 微软可视-CS-双相模板instantia (14认同)
  • 历史评论:我使用了一个具有计数括号阶段和编译阶段的编译器,IOW给出`template <class T> class C {在这里放任何东西&〜 - (但没有任何不平衡且字符串文字外没有8位字符)如果`C`从未实例化,那将被接受!这是十多年前的事了. (3认同)
  • 对于好奇,这是_C++模板:完整指南_的摘录. (2认同)
  • 除了@ SteveJessop对依赖名称的评论之外,还值得指出的是依赖名称上发生的"依赖于参数的查询".这意味着将找不到`:: sqrt(:: NS :: A)`,因为额外的查找将发生在`:: NS`而不是`::`中.最后一点是,不会搜索别名的范围,typedef或using,只会搜索alised类型本身的范围. (2认同)

归档时间:

查看次数:

9443 次

最近记录:

12 年 前