它是如何工作的?可能这里做错了什么。
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
只要按此顺序包含 header ,我就可以在主程序中运行它
-
#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
文件的内容直接转储到您的源代码中。
因此,即使 generic_alg.H
使用了它没有定义或包含的内容,唯一直接编译的是 main.C
,以及 的完整定义code>trait_implementation.H
直接在 generic_alg.H
之前转储到 main.C
中,因此当它从 编译代码时定义存在>generic_alg.H
.
即使它有效,它仍然是一个坏主意,因为现在 每个 使用 generic_alg.H
的源文件都必须显式包含 trait_implementation.H
首先,没有明显的文档说明这种依赖关系。
关于c++模板特征——编译时不包含头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54410244/