为什么在实例化模板类时编译器无法访问.cpp

why the .cpp is not accessible by the compiler when instanciated a template class

本文关键字:编译器 访问 cpp 实例化 为什么      更新时间:2023-10-16

以下链接部分回答了这个问题:

为什么模板只能在头文件中实现?

但以下内容仍然存在:

为什么编译器无法访问.cpp?

指定的语言使编译器可以一次编译一个"翻译单元"(一个源文件,加上它包含的所有头文件),而无需在该阶段引用任何其他源文件。这是为了允许在编译器不必将所有程序保存在内存中的情况下构建大型程序——这在开发这种编译模型时(半个世纪或更长时间前)是不可能的,而且在今天仍然存在问题。

因此,一个源文件中的定义在其他文件中不可用,并且您不能执行任何需要此类定义的操作(例如实例化模板)。

基本上,因为编译器不知道要咨询哪个其他.cpp。编译器一次只能编译一个.cpp文件。

编译过程并非如此。它本身并不查找文件。它只是编译你告诉它要编译的文件,将#included文件的内容粘贴到其中。通常的做法是.cpp#include头文件进行归档,然后将其编译为一个单独的翻译单元。

如果foo.h包含一个没有函数定义的类模板(它们在foo.cpp中),而main.cpp包含#include,则该翻译单元将没有函数定义。但它需要具有能够实例化模板的函数定义。将#include "foo.h"#include "foo.cpp"都放在main.cpp中可以修复它,但这违背了通常只包含头文件的做法。这也意味着每个文件都需要记住同时包含这两者。有些人喜欢将函数实现放在foo.tpp文件中,然后将其包含在foo.h的底部。这执行相同的工作。

但主要的一点是,C++编译器本身找不到go和定位文件。它只编译你告诉它的文件。