我是C ++的新手,现在正在浏览模板并遇到过这个问题。
当模板类型需要另一个类时,是否会有包含订单的特定要求?
vector<string> stringVector;
像这样:我们应该在string
之前加入vector
吗?
我读了这篇文章(C++ Header order),并且它说头文件应该包含在类要求顺序中。
但是,正如这个(Template Compilation)表明,或者是我的误解,“编译器为模板类实例化中给出的特定类型生成代码”,而我认为这意味着当我们实例化stringVector
时,编译器已经包含string
标头,所以不应该有vector
这里{{1需要“关系。
那么,哪种解释是对的,我解释的哪一部分是对还是错?感谢。
答案 0 :(得分:3)
每当在c ++中使用模板时,必须将使用过的模板类型称为完整类型,当您要使用字符串向量时,需要包含字符串类。包含只不过是将包含文件中的代码复制并粘贴到您的包含所在的位置。
1> #include <string>
2> #include <vector>
3>
4> class Foo {
5> private:
6> vector<string> bar;
7> }
编译第6行时,编译器必须知道两种类型都是完整类型(字符串因为它是模板,因为它不是指针而是矢量)。包含在类上,因此编译器在编译第6行时知道这两种类型。无论你将它们包含在哪个顺序都无关紧要。
答案 1 :(得分:1)
在使用它们之前,您基本上必须包括所有依赖项。 因此,如果首先包含字符串或向量,则在您的示例中无关紧要。在使用它们之前,它们必须都包括在内。
如果头文件彼此依赖,则顺序很重要。假设有一个头文件a.h和b.h,其中b.h取决于a.h.然后必须首先包括a.h。但如果有人必须这样做,程序就不会以干净的方式编写。头文件的所有依赖项都应该使用包含保护而不是其他地方包含在头文件中。
据我了解这一点。