怎么回事?可能在这里做错了什么。
定义。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
我可以在我的主目录中运行它,只要我按此顺序包含标题
-
#include trait_implementation.H
-
#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
,并且没有明显的文档明确说明该依赖项。