c++ - 编译器如何编译模板和类型检查?(c++)
问题描述
我的问题是编译器如何编译模板以及编译器如何进行类型检查。
我想知道编译器如何编译模板代码。
首先,我只是向您展示我认为模板是如何工作的?
第一的。编译器复制并粘贴模板代码替换为模板参数
template <typename T>
class vector
{
T* data;
~~~
};
int main()
{
vector<int> a;
}
--->
class vector<int>
{
int* data;
~~~
};
int main()
{
vector<int> a;
}
第二。编译器尝试使用此转换后的代码进行类型检查。(我认为这就是为什么所有使用模板的翻译单元都应该有(知道)模板定义的原因)
这就是我认为编译器的工作方式。实际上我不太了解编译器是如何工作的。我只知道预处理,链接器.....
解决方案
模板分两个阶段编译:
在定义时(还没有实例化),检查模板代码本身的正确性(忽略模板参数),例如:语法错误、未知名称等。
在实例化时再次检查模板代码,例如。检查依赖于模板参数的所有部分。
注意:如果您只是定义了一个模板,但不使用它,那么只会检查 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.
}
推荐阅读
- c# - 启用“指定批量大小”时,Azure DevOps 版本中缺少控制台输出
- pointers - 将实现特征的数据存储在向量中
- android - 不同的风味使用不同的存储库
- magento2 - 无效的表单键。请刷新页面 - 每当我创建帐户或登录时,访客页面都会弹出此错误
- ms-access - 使用 RIGHT() 函数访问 SQL 更新案例
- java - Java - 没有迭代器分配的无重复集合
- autodesk-forge - Autodesk Forge - 在 Forge 中加载、修改和查看 Revit 模型
- java - 如何根据字符串的长度对字符串进行分组?
- ruby-on-rails - ActiveRecord::Base 的完整文档,包括实例方法列表
- javascript - 继承原型JS时如何传递参数?