正向声明库名称

xyz*_*xyz 0 c++ stl compilation

摘自"Exceptional C++":

"在过去,你可以在这种情况下用"class ostream"替换"#include",因为ostream曾经是一个类而且它不在命名空间std中.唉,不再.写"class ostream; "有两个原因是非法的:

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

ostream现在是模板的typedef; 具体来说,它的typedef为basic_ostream.在任何情况下,basic_ostream模板不仅在前向声明时都很麻烦,而且你根本无法可靠地前向声明它,因为允许库实现添加自己的额外模板参数(超出了标准),当然,你的代码不会知道程序员不允许在命名空间std中为事物编写自己的声明的规则的主要原因之一."

我的问题:

我不明白用粗体标出的部分.

谢谢,

Axe*_*xel 5

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

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

如果您想要ostream的前向声明,请改为包含<iosfwd>.(或者查看实现的内容).