【问题标题】:Forward-declaring library names前向声明库名称
【发布时间】:2010-07-11 08:17:45
【问题描述】:

摘自“卓越的 C++”:

“在过去,您可以在这种情况下将“#include”替换为“class ostream;”,因为 ostream 曾经是一个类,并且它不在命名空间 std 中。唉,没有更多了。写作“ class ostream;" 是非法的,原因有两个:

ostream 现在位于命名空间 std 中,不允许程序员声明任何存在于命名空间 std 中的东西。

ostream 现在是模板的 typedef;具体来说,它的类型定义为 basic_ostream。 不仅 basic_ostream 模板在任何情况下都无法进行前向声明,而且您根本无法可靠地前向声明它,因为允许库实现执行诸如添加自己的额外模板参数之类的事情(除了那些标准所要求的),当然,您的代码不会知道——这是不允许程序员为命名空间 std 中的事物编写自己的声明的规则的主要原因之一。"

我的问题:

我不明白用粗体标记的部分。

谢谢,

【问题讨论】:

  • 您的问题标题和问题文本问的是两个不同的问题。
  • @Neil :好的,已尝试使它们保持一致。

标签: c++ stl compilation


【解决方案1】:

粗体部分只是说你不能像这样转发声明 ostream:

class ostream;
  • 因为 ostream 现在是 typedef,并且声明的细节可能会或可能不会因不同的实现而异。
  • 因为不允许程序员在命名空间 std 中声明任何内容(尽管它适用于大多数编译器)。

如果您想要 ostream 的前向声明,请改为包含 。 (或者看看你的实现是什么样的)。

【讨论】:

    【解决方案2】:

    如果您同意这一事实,您可以认为它仅适用于特定编译器的特定版本。这会很丑,但你可以做到(你几乎可以将标题的内容复制到你的代码中,它仍然可以工作)。

    您不应该这样做的原因正是它在标题中的原因。您想使用一些外部接口并且不想关心编译器内部。编译器向您保证外部接口。至于实现,那是编译器的选择。

    【讨论】:

    • 当我的标题中有这个时:friend ostream& operator
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多