使用模板类的c ++编译器行为

时间:2013-01-16 09:48:55

标签: c++

  

可能重复:
  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!!!";}
};

如果我删除模板&lt; T类&gt;我得到了缺少&lt; iostream&gt; include的错误。

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

只是要指出,当我说它工作时,我的意思是当我编写类时,它没有向我显示任何编译错误,但仅当我使用它而不是非模板类时,错误立即显示

2 个答案:

答案 0 :(得分:2)

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

要验证这一点,请在最后添加此行A<int>;

jrok指出Two phase lookup - explanation needed的更多信息。

编辑:

链接的帖子提出了一个有趣的观点,即使没有实例化,这也会error out on gcc和clang。我想像我一样,你是MSVC ++

答案 1 :(得分:1)

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

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