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
#include trait_implementation.H
#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.C
,trait_implementation.H
的完整定义被转储到 main.C
直接在 generic_alg.H
之前,所以当它从 generic_alg.H
.
开始编译代码时,定义就存在了
即使它有效,它仍然是一个坏主意,因为现在 每个使用 generic_alg.H
的 源文件必须首先明确包含 trait_implementation.H
,然后没有明显的文件说明这种依赖性。
这是怎么回事?可能这里做错了。
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
#include trait_implementation.H
#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.C
,trait_implementation.H
的完整定义被转储到 main.C
直接在 generic_alg.H
之前,所以当它从 generic_alg.H
.
即使它有效,它仍然是一个坏主意,因为现在 每个使用 generic_alg.H
的 源文件必须首先明确包含 trait_implementation.H
,然后没有明显的文件说明这种依赖性。