这是怎么回事?可能是这里做错了什么。
德芙
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
只要按此顺序包含标题,我就可以在主目录中运行它
#include trait_implementation.H
#include generic_alg.H
int main() { function<FAKE>(); return 0; }
这是怎么编译的?泛型_Alg.h只能编译一个正向声明的traits类。它可以看到特征定义,当包含在正确的顺序中时,即使通用的_Alg.h本身不包括特征实现。
使用联机编译器,我只能重新创建: https://onlinegdb.com/B1BEUlp7E
#include 对于最实际的目的,是请求转储 include -将文件直接导入源代码。
#include
include
所以即使 generic_alg.H 使用不定义或不包含的内容,直接编译的唯一内容是 main.C 以及 trait_implementation.H 被扔进 主C 直接前 通用电气公司 ,所以当它开始编译代码时,定义就存在了。 通用电气公司 .
generic_alg.H
main.C
trait_implementation.H
尽管它有效,但它仍然是一个坏主意,因为现在 每一个 使用的源文件 通用电气公司 必须明确包括 特性实现.h 首先,没有明显的文档说明这种依赖性。