【问题标题】:C++ header order with template带有模板的 C++ 标头顺序
【发布时间】:2017-06-19 11:05:03
【问题描述】:

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

当模板类型需要另外一个类时,会不会对header包含顺序有具体要求?

vector<string> stringVector;

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

我读到了这个 (C++ Header order),它说头文件应该包含在类要求顺序中。

但是,正如这个 (Template Compilation) 所表明的,或者如果是我的误解,“编译器会为模板类实例化中给出的特定类型生成代码”,我认为这是表示当我们实例化stringVector时,编译器已经包含string标头,所以不应该有“vector这里是string必需”的关系。

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

【问题讨论】:

    标签: c++ templates compilation header-files


    【解决方案1】:

    每当你在 C++ 中使用模板时,所使用的模板类型必须被称为完整类型,这要求你在要使用字符串向量时包含字符串类。包含只不过是将包含文件中的代码复制并粘贴到放置包含的位置。

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

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

    【讨论】:

      【解决方案2】:

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

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

      这是我的理解。

      【讨论】:

      • 感谢您的完成 :) 重要的是:“如果有人必须这样做,程序就不是以干净的方式编写的。”
      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 2014-11-06
      • 2021-04-15
      • 1970-01-01
      • 2012-12-02
      相关资源
      最近更新 更多