这如何运作?可能在这里做错了。
def.H
null
trait_implementation.H
enum some_enum { FAKE = 0, };
template < some_enum T> struct example_trait;
generic_alg.H
#include "def.H"
template<> struct example_trait<FAKE> {
static constexpr size_t member_var = 3; };
main.C
只要按顺序包含标题,我就可以在主目录中运行它
#include "def.H"
template < some_enum T, typename TT = example_trait<T> > void
function() { std::cout << TT::member_var << std::endl; }
#include trait_implementation.H
#include generic_alg.H
它如何编译?可以使用常规声明的traits类编译generic_alg.H。即使generic_alg.H本身不包含trait_implementation.H,也可以按正确的顺序查看traits定义。怎么可能呢?
使用在线编译器,我只能重新创建:https://onlinegdb.com/B1BEUlp7E
答案 0 :(得分:2)
SYSTEM
出于大多数实际目的,是将#include
版文件的内容直接转储到源代码中的请求。
因此,即使include
使用了未定义或包含的内容,唯一可以直接编译的是generic_alg.H
,并且main.C
的完整定义被转储到{{1 }}紧接trait_implementation.H
之前,因此当定义从main.C
编译代码时就存在该定义。
即使有效,但这仍然不是一个好主意,因为现在使用generic_alg.H
的每个源文件必须首先明确包含generic_alg.H
,并且没有明显的文档制作这种依赖性很明显。