C++ 模板特征 -- 编译时不包含标头
c++ template trait -- compiling without including header
这是
怎么回事?可能在这里做错了什么。
定义。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
,并且没有明显的文档明确说明该依赖项。
相关文章:
- 在CMake中使用find_package时,是否会显式包含标头
- GCC 包含标头(使用"-include")CMake 未检测到的更改
- 使用预处理指令检查是否包含标头?
- 更智能地在C++中包含保护,以便在不同的命名空间中多次包含标头
- 如何在 c++ 中有条件地包含标头?
- main.cpp 如何知道包含标头的源文件?
- 有没有办法告诉 g++ 编译器,而不是在某个 -I 路径中查找包含标头
- QT 如何包含标头和 cpp 文件
- 在 c++ 中,如果包含标头,为什么我会收到'does not a name of type'错误?
- CLion 无法解析类型 std::unordered_map,即使它提示我包含标头并且编译工作
- 是否可以链接到,包括和使用静态库,而无需额外包含标头/文件
- 数组下标编译的无效类型'int[int]'由于 -Wfatal 错误而终止
- 为什么包含标头会导致"use of auto before deduction of auto"错误?
- 如何告诉qmake在从dbus xml生成文件时包含标头
- C++ 模板特征 -- 编译时不包含标头
- 如何使用 g++ 包含预编译的 .h.gch 标头
- 如何包含自编译库中的标头
- 包含包含标头的目录时出现编译错误
- 防止标头包含在编译时的某些文件中
- 错误:尽管包含标头,但尚未声明类,并且代码在其他地方编译良好