0

可能重复:
两阶段查找 - 需要解释

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

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

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

如果我删除模板 <class T>,我会得到缺少 <iostream>include 的错误。

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

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

4

2 回答 2

2

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

为了验证这一点,在最后添加这一行,A<int>;

两阶段查找中的更多信息- jrok 指出需要解释。

编辑:

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

于 2013-01-16T09:51:10.557 回答
1

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

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

于 2013-01-16T09:59:53.373 回答