c++ template trait -- 编译时不包含 header

c++ template trait -- compiling without including header

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

def.H

enum some_enum { FAKE = 0, };

template < some_enum T> struct example_trait;

trait_implementation.H

#include "def.H"

template<> struct example_trait<FAKE> {  
static constexpr size_t member_var = 3;  };

generic_alg.H

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

main.C

我可以 运行 这个在我的 main 中,只要我在这个顺序中包含 headers

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

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

这个编译的怎么样? can generic_alg.H 仅使用前向声明的 traits class 进行编译。它可以看到以正确顺序包含的特征定义,即使 generic_alg.H 本身不包含 trait_implementation.H。这怎么可能?

使用在线编译器我只能re-create:https://onlinegdb.com/B1BEUlp7E

#include 是,出于大多数实际目的,请求将 include-ed 文件的内容直接转储到您的源代码中。

所以即使 generic_alg.H 使用了它没有定义或包含的东西,唯一直接编译的是 main.Ctrait_implementation.H 的完整定义被转储到 main.C 直接在 generic_alg.H 之前,所以当它从 generic_alg.H.

开始编译代码时,定义就存在了

即使它有效,它仍然是一个坏主意,因为现在 每个使用 generic_alg.H 源文件必须首先明确包含 trait_implementation.H,然后没有明显的文件说明这种依赖性。