【问题标题】:Templates classes and preprocessor directives模板类和预处理器指令
【发布时间】:2012-08-14 16:40:50
【问题描述】:

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

#ifndef MY_CLASS
#define MY_CLASS

template<typename T>
class My_Class
{};

#endif

是必需品吗?

【问题讨论】:

  • 你的意思是“类模板”。 “模板类”是另一回事。
  • @KerrekSB:我同意提问者的意思是“类模板”。然而,要找出“模板类”的含义似乎并不容易,而且是一种错误的“类模板”写法。你能为我解释一下吗? “模板类”是什么意思?
  • @MagnusHoff: My_Class 是一个类模板(注意它是一个模板)。 My_Class&lt;int&gt; 是一个模板类(注意它是一个)。正如威廉·沙特纳所说,这一切都在名称中:-)
  • @KerrekSB 是的,我的意思是类模板。谢谢你的解释!
  • C++11 更改了该领域 C++03 标准中使用的术语。不再使用术语“模板类”。现在的恰当术语是“模板专业化”,这让我们这些喜欢“类模板”与“模板类”的聪明的人非常沮丧。

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


【解决方案1】:

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

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() {}

【讨论】:

    【解决方案2】:

    宏可能被用作“包含保护”,如果标题恰好被多次包含,可以防止多次声明错误。所以是的,它们对于其他所有内容都是“必要的”:如果您可以确定标题不会被多次包含,您可以将它们排除在外,但另一方面,它们并没有真正增加文件大小或编译时间。

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多