c++ - 前向声明库名称

标签 c++ stl compilation

摘自“卓越的 C++”:

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

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

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

我的问题:

我不明白加粗的部分。

谢谢,

最佳答案

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

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

如果您想要 ostream 的前向声明,请改为包含 。 (或者深入了解您的实现情况)。

关于c++ - 前向声明库名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3222351/

相关文章:

c++ - 使用 Xerces C++ 对 DOM 部分进行 XML 序列化

c++ - 在实例变量中定义字段会导致所有实例字段相同

c++ - 虚幻引擎 4.10.1 无法编译 Visual Studio 2015 项目

c++ - 将左值绑定(bind)到右值引用时 move 变量的语义和生命周期

c++ - Git 1.56 boost 存储库中缺少 boost::posix_time::to_time_t

c++ - std::function 和 std::bind 行为

c++ - 为什么使用自定义 wcscmp 和 wmemcmp 比较器对 vector<wstring> 进行排序比默认速度快得多?

c++ STL sort 带有额外的参数 'invalid operator <'

c - 如何在 GnuTLS 中使用共享对象构建示例

vue.js - 错误类型错误 : The 'compilation' argument must be an instance of Compilation