代码之家  ›  专栏  ›  技术社区  ›  Andre Marin

C++模板特性——不含头的编译

  •  0
  • Andre Marin  · 技术社区  · 6 年前

    这是怎么回事?可能是这里做错了什么。

    德芙

    enum some_enum { FAKE = 0, };
    
    template < some_enum T> struct example_trait;
    

    特性实现.h

    #include "def.H"
    
    template<> struct example_trait<FAKE> {  
    static constexpr size_t member_var = 3;  };
    

    通用电气公司

    #include "def.H"
    template < some_enum T, typename TT = example_trait<T> > void
    function() { std::cout << TT::member_var << std::endl; }
    

    主C

    只要按此顺序包含标题,我就可以在主目录中运行它

    1. #include trait_implementation.H
      
    2. #include generic_alg.H
      

    int main() {
        function<FAKE>();
        return 0; 
    }
    

    这是怎么编译的?泛型_Alg.h只能编译一个正向声明的traits类。它可以看到特征定义,当包含在正确的顺序中时,即使通用的_Alg.h本身不包括特征实现。

    使用联机编译器,我只能重新创建: https://onlinegdb.com/B1BEUlp7E

    1 回复  |  直到 6 年前
        1
  •  2
  •   ShadowRanger    6 年前

    #include 对于最实际的目的,是请求转储 include -将文件直接导入源代码。

    所以即使 generic_alg.H 使用不定义或不包含的内容,直接编译的唯一内容是 main.C 以及 trait_implementation.H 被扔进 主C 直接前 通用电气公司 ,所以当它开始编译代码时,定义就存在了。 通用电气公司 .

    尽管它有效,但它仍然是一个坏主意,因为现在 每一个 使用的源文件 通用电气公司 必须明确包括 特性实现.h 首先,没有明显的文档说明这种依赖性。