【问题标题】:c++ compiler behaviour using template class [duplicate]使用模板类的c ++编译器行为[重复]
【发布时间】:2013-01-16 09:48:54
【问题描述】:

可能重复:
Two phase lookup - explanation needed

当我使用模板类时,编译器不会向我显示缺少#includes 的错误/警告。

例如,如果我有一个名为“A”的类,它看起来或多或少像这样:

template<class T>
class A {
    void print() const {cout << "Hey I didn't use include for 
                                 iostream and It works just fine!!!";}
};

如果我删除模板 ,我会收到缺少 include 的错误。

为什么当我使用模板类时编译器不显示这些错误?

只是要指出,当我说它有效时,我的意思是当我编写类时它不会显示任何编译错误,但只有当我使用它而不是非模板类时才会显示错误,而错误会立即显示.

【问题讨论】:

标签: c++


【解决方案1】:

当你编写模板代码时,大量的语法检查只有在你创建这个类的实例时才会发生,如果它从未被使用过,它永远不会被检查。

要验证这一点,请在末尾添加这一行,A&lt;int&gt;;

Two phase lookup - explanation needed 的更多信息,正如 jrok 指出的那样。

编辑:

链接的帖子提出了一个有趣的观点,即使没有实例化,error out on gcc 也会发出叮当声。我想和我一样,你在 MSVC++ 上

【讨论】:

    【解决方案2】:

    当编译器第一次解析你的模板时,它只需要执行最基本的语法检查和非依赖类型的类型检查(不是根据模板参数定义的类型)。对于完全专门化的模板类型的每个成员函数,所有依赖类型(依赖于模板参数的类型)的类型检查只需要在第一次遇到使用该函数的表达式时(例如通过调用它)进行。这也意味着您不使用(用于特定专业化)模板类型的任何成员函数可能根本无法完全编译。

    这称为两阶段名称查找,(如其他答案中所述)您可以在此处找到有关它的更多信息:Two-phase lookup

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2011-03-04
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多