首页 > 解决方案 > 编译器如何编译模板和类型检查?(c++)

问题描述

我的问题是编译器如何编译模板以及编译器如何进行类型检查。

我想知道编译器如何编译模板代码。

首先,我只是向您展示我认为模板是如何工作的?

第一的。编译器复制并粘贴模板代码替换为模板参数

template <typename T>
class vector
{
   T* data;
~~~
};

int main()
{
   vector<int> a;
}

--->

class vector<int>
{
   int* data;
~~~
};

int main()
{
   vector<int> a;
}

第二。编译器尝试使用此转换后的代码进行类型检查。(我认为这就是为什么所有使用模板的翻译单元都应该有(知道)模板定义的原因)

这就是我认为编译器的工作方式。实际上我不太了解编译器是如何工作的。我只知道预处理,链接器.....

标签: c++templates

解决方案


模板分两个阶段编译:

  1. 在定义时(还没有实例化),检查模板代码本身的正确性(忽略模板参数),例如:语法错误、未知名称等。

  2. 在实例化时再次检查模板代码,例如。检查依赖于模板参数的所有部分。

注意:如果您只是定义了一个模板,但不使用它,那么只会检查 1. 阶段。

例如在你的情况下:

template <typename T>
class vector
{
   T* data, // 1. Phase check: compile error: missing semicolon
~~~
};

int main()
{
   vector<int> a; // 2. Phase check: Instantiation: T replaced with int and template code rechecked.
}

推荐阅读