为什么在实例化模板类时编译器无法访问.cpp
why the .cpp is not accessible by the compiler when instanciated a template class
以下链接部分回答了这个问题:
为什么模板只能在头文件中实现?
但以下内容仍然存在:
为什么编译器无法访问.cpp?
指定的语言使编译器可以一次编译一个"翻译单元"(一个源文件,加上它包含的所有头文件),而无需在该阶段引用任何其他源文件。这是为了允许在编译器不必将所有程序保存在内存中的情况下构建大型程序——这在开发这种编译模型时(半个世纪或更长时间前)是不可能的,而且在今天仍然存在问题。
因此,一个源文件中的定义在其他文件中不可用,并且您不能执行任何需要此类定义的操作(例如实例化模板)。
基本上,因为编译器不知道要咨询哪个其他.cpp。编译器一次只能编译一个.cpp文件。
编译过程并非如此。它本身并不查找文件。它只是编译你告诉它要编译的文件,将#include
d文件的内容粘贴到其中。通常的做法是.cpp
对#include
头文件进行归档,然后将其编译为一个单独的翻译单元。
如果foo.h
包含一个没有函数定义的类模板(它们在foo.cpp
中),而main.cpp
包含#include
,则该翻译单元将没有函数定义。但它需要具有能够实例化模板的函数定义。将#include "foo.h"
和#include "foo.cpp"
都放在main.cpp
中可以修复它,但这违背了通常只包含头文件的做法。这也意味着每个文件都需要记住同时包含这两者。有些人喜欢将函数实现放在foo.tpp
文件中,然后将其包含在foo.h
的底部。这执行相同的工作。
但主要的一点是,C++编译器本身找不到go和定位文件。它只编译你告诉它的文件。
相关文章:
- 编译器(Visual C++)如何优化按索引访问矢量元素?
- 处于默认参数位置的 Lambda 无法访问好友成员。这是编译器错误吗?
- 如果使用低于 VS2015 的 vc++ 编译器版本编译,则 DLL 中的访问冲突
- 现代C++编译器是否优化了对类中同一数据成员的重复访问?
- C STD ::排序Intel编译器错误:访问违规
- SSTREAM通过公共访问编译器错误重新编辑
- Visual C 编译器生成无法访问的.pyd文件
- 编译器(GCC)如何处理C 的访问控件
- 为什么在实例化模板类时编译器无法访问.cpp
- 微优化-访问递归成员时的编译器优化
- 在多继承编译器的情况下访问成员变量是否依赖?如何正确地做
- 编译器何时需要访问库
- std::unique_ptr 编译器错误:派生类的成员无法访问基类的私有成员
- 错误 C2248:无法访问在类中声明的私有成员,编译器行为异常
- 为什么编译器允许越界数组访问,即使使用 constexpr 索引也是如此
- 通过指针访问类的成员时"unqualified-id"编译器错误
- 用于顺序内存访问的编译器嵌套循环优化
- linux服务器上的C++11兼容编译器,无需root访问权限
- C++编译器XE5:初始化GDI+时发生访问冲突
- as-if规则是否防止编译器对全局/成员变量的访问重新排序