C++ 模板特征 -- 编译时不包含标头

c++ template trait -- compiling without including header

本文关键字:包含标 编译 特征 C++      更新时间:2023-10-16
这是

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

定义。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; }

主要。C

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

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

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

这是怎么编译的?可以generic_alg。H 仅使用前向声明的特征类进行编译。 当以正确的顺序包含时,它可以看到特征定义,即使generic_alg也是如此。H本身不包括trait_implementation.H。 这怎么可能呢?

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

#include

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

因此,即使generic_alg.H使用了它没有定义或包含的东西,唯一直接编译的是main.C,并且trait_implementation.H的完整定义直接在generic_alg.H之前转储到main.C中,因此当它从generic_alg.H编译代码时,定义就存在了。

即使它有效,它仍然是一个坏主意,因为现在每个使用 generic_alg.H 的源文件都必须首先显式包含trait_implementation.H,并且没有明显的文档明确说明该依赖项。