摘自“Exceptional C ++”:
“在过去,您可以在这种情况下将”#include“替换为”class ostream;“,因为ostream曾经是一个类而且它不在命名空间std中。唉,没有更多。写道” class ostream;“因为两个原因是非法的:
ostream现在位于名称空间std中,并且不允许程序员声明名称空间std中的任何内容。
ostream现在是模板的typedef;具体来说,它的typedef为basic_ostream。 在任何情况下,basic_ostream模板不仅不会被转发声明,而且你根本无法可靠地向前声明它,因为允许库实现添加自己的额外模板参数(除此之外)标准所要求的,当然,你的代码不会知道 - 程序员不允许在命名空间std中为事物编写自己的声明的规则的主要原因之一。“< / p>
我的问题:
我不明白以粗体标出的部分。
谢谢,
答案 0 :(得分:5)
粗体部分只是说你不能像这样转发声明ostream:
class ostream;
如果您想要ostream的前向声明,请包含&lt; iosfwd&gt;代替。 (或者查看实现的内容)。
答案 1 :(得分:1)
如果您对这个事实感到满意,您可以只对特定版本的特定编译器起作用。这将是丑陋的,但你可以做到(你可以将标题的内容复制到你的代码中,它仍然可以工作)。
你不应该这样做的原因正是为什么它在标题中。您想使用一些外部接口,而不想关心编译器内部。编译器保证您的外部接口。至于实现,这是编译器的选择。