正向声明库名称

时间:2010-07-11 08:17:45

标签: c++ stl compilation

摘自“Exceptional C ++”:

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

ostream现在位于名称空间std中,并且不允许程序员声明名称空间std中的任何内容。

ostream现在是模板的typedef;具体来说,它的typedef为basic_ostream。 在任何情况下,basic_ostream模板不仅不会被转发声明,而且你根本无法可靠地向前声明它,因为允许库实现添加自己的额外模板参数(除此之外)标准所要求的,当然,你的代码不会知道 - 程序员不允许在命名空间std中为事物编写自己的声明的规则的主要原因之一。“< / p>

我的问题:

我不明白以粗体标出的部分。

谢谢,

2 个答案:

答案 0 :(得分:5)

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

class ostream;
  • 因为ostream现在是一个typedef,声明的细节可能会或可能不会因不同的实现而有所不同。
  • 因为程序员不允许在命名空间std中声明任何内容(尽管它可以在大多数编译器上工作)。

如果您想要ostream的前向声明,请包含&lt; iosfwd&gt;代替。 (或者查看实现的内容)。

答案 1 :(得分:1)

如果您对这个事实感到满意,您可以只对特定版本的特定编译器起作用。这将是丑陋的,但你可以做到(你可以将标题的内容复制到你的代码中,它仍然可以工作)。

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