C++ header 使用模板排序

C++ header order with template

我是 C++ 的新手,现在正在研究模板并遇到了这个问题。

当模板类型需要另一个 class 时,是否对 header 包含顺序有特定要求?

vector<string> stringVector;

像这样:我们应该在 vector 之前包含 string 吗?

我读了这个 (C++ Header order),它说 header 文件应该包含在 class-requirement 订单中。

然而,正如这个(Template Compilation)所表明的,或者如果是我的误解,"the compiler generates the code for the specific types given in the template class instantiation",我认为这意味着当我们实例化 stringVector,编译器 已经 包含 string header,所以不应该有“vector 这里是 string 必需”关系。

那么,到底哪种解释是对的,我的解释哪一部分是对的还是错的呢?谢谢。

你基本上必须在使用它们之前包含所有依赖项。 因此,在您的示例中,是否首先包含字符串或向量并不重要。在使用它们之前必须将它们都包括在内。

如果头文件相互依赖,顺序确实很重要。假设有一个头文件 a.h 和 b.h,其中 b.h 依赖于 a.h。 THEN a.h 必须首先包含在内。但如果有人必须那样做,程序就不是以干净的方式编写的。头文件的所有依赖项都应该包含在头文件中,使用 include guards 而不是其他地方。

这是我的理解。

无论何时在 C++ 中使用模板,所使用的模板类型都必须是完整类型,这要求您在要使用字符串向量时包含字符串 class。 include无非就是将include文件中的代码复制粘贴到你的include所在的地方。

1> #include <string>
2> #include <vector>
3>  
4> class Foo {
5> private:
6>     vector<string> bar;    
7> }

编译第 6 行时,编译器必须知道这两种类型都是完整类型(字符串因为它是模板,向量因为它不是指针)。 include 放在 class 之上,因此编译器在编译第 6 行时知道这两种类型。包含它们的顺序无关紧要。