c++ - 模板类和预处理器指令

标签 c++ templates c-preprocessor preprocessor-directive

模板类是众多可能的类,所以我问我:预处理器指令

#ifndef MY_CLASS
#define MY_CLASS

template<typename T>
class My_Class
{};

#endif

有必要吗?

最佳答案

包含防护可防止重复包含同一文件。您需要它们来防止翻译单元包含以下非法定义:

template <typename T> class My_Class { };
template <typename T> class My_Class { };

// Error: redefinition of ‘class Foo<T>’

重复包含很容易发生。例如,考虑这样一种情况,您包含 AB,并且由于某些未记录的原因,A 已经包含 B 。您可能无权从显式包含中省略 B,但也不应要求 A 不包含它。只有使用包含防护(或某些等效机制)才能使这样的文件结构成为可能。

简而言之:您可以有重复的声明,但在一个翻译单元内只能有一个定义

反例:以下合法的:

template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo;
template <typename T> class Foo { };
int main() {}

关于c++ - 模板类和预处理器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12019224/

相关文章:

c++ - 方法返回模板类 C++

c++ - 重载 << 使用模板 : Why am I getting the following error?

c++ - C++模板-在类外部实现

c - 常量变量的定义与#define

c++ - 如何流式传输 std::variant<...,...>

c++ - 执行 a.out 文件 (C++) MacOS Sierra 10.12.1 时出现问题

c++ - 如何在 Scintilla 中隐藏换行符?

c++ - 在 C++ 中继承层次结构时提取实现者

c - 预处理器是否在编译器开始运行之前准备了一个唯一常量字符串列表?

c - 在 C 语言的编译时评估的预处理器函数