当我使用模板类时,编译器不会向我显示缺少#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的错误。
为什么编译器在使用模板类时不显示这些错误?
只是要指出,当我说它工作时,我的意思是当我编写类时,它没有向我显示任何编译错误,但仅当我使用它而不是非模板类时,错误立即显示
答案 0 :(得分:2)
当您编写模板代码时,只有当您创建此类的实例时,才会发生大量的语法检查,如果从未使用它,则永远不会检查它。
要验证这一点,请在最后添加此行A<int>;
jrok指出Two phase lookup - explanation needed的更多信息。
编辑:
链接的帖子提出了一个有趣的观点,即使没有实例化,这也会error out on gcc和clang。我想像我一样,你是MSVC ++
答案 1 :(得分:1)
当编译器首先解析您的模板时,只需要执行最基本的语法检查并对非依赖类型(未根据模板参数定义的类型)进行类型检查。对于完全专用模板化类型的每个成员函数,所有对依赖类型(依赖于模板参数的类型)的类型检查只需要在第一次使用该函数遇到表达式时(例如通过调用它)完成。这也意味着您不使用模板化类型的任何成员函数(对于特定的特化)可能根本不会完全编译。
这称为两阶段名称查找,并且(如其他答案中所述)您可以在此处找到有关它的更多信息:Two-phase lookup