当前位置: 首页 > 知识库问答 >
问题:

关于std::ostream构造函数

周朗
2023-03-14

我想这样使用std::ostream:

int main()
{
    std::ostream os;
    os << "something ..." << std::endl;
    return 0;
}

有一个错误,说ostream构造函数受到保护:

错误:'std::basic_ostream

但我记得操作员

// In a class. 
friend std::ostream & operator<<(std::ostream& out, const String & s) {
    out << s.m_s;
    return out;
}

关于为什么我的代码不起作用,有什么建议吗?


共有1个答案

缪宪
2023-03-14

std::ostream、std::istream或std::iostream是标准库中流类型的基类(例如std::stringstream、std::fstream等)。这些类受实例化保护,您只能实例化它们的派生类。错误消息

错误:'std::basic_ostream

告诉你同样的道理。

您的第二个示例是有效的,因为您可以使用对派生类基类的引用。在这种情况下,不调用构造函数,引用仅引用现有对象。这是一个如何使用std::ostream的示例

#include <iostream>

int main() {
    std::ostream& os = std::cout;
    os << "something ..." << std::endl;
}

使用std::ostream背后的原因

 类似资料:
  • 我在下面的某个地方看到了代码片段。 由于前面提到的代码片段工作得很好,它表明std::cout是从std::ostream派生而来的。但我还找不到任何直接的参考资料。 根据文件,其中说[强调我的]: 全局对象std::cout和std::wcout控制输出到实现定义类型的流缓冲区(源自std::stream buf),与标准C输出流stdout相关联。 上面的引文表示,控制输出到派生自std::s

  • 在G++中。如果复制构造函数不是显式的,代码可以编译并正常工作(但我希望强制执行只有对对象的引用才能用作参数和返回值)。代码还在删除对的调用后进行编译(因此不成问题)。因此,我的问题是,std::sort在调用使编译此代码失败的比较函数时会做什么,以及如何修复它。 经过大量的研究,唯一接近我的问题是复制初始化,对复制构造函数的调用是显式的还是隐式的?它链接到GCC中的一个bug。然而,clang显

  • 问题内容: 因此,由于我一直在使用Spring,所以如果我要编写一个具有依赖项的服务,我将执行以下操作: 我现在遇到了使用另一种约定实现相同目标的代码 我知道这两种方法都行得通。但是使用选项B有一些好处吗?对我来说,它在类和单元测试中创建了更多代码。(必须编写构造函数,而不能使用@InjectMocks) 有什么我想念的吗?除了将代码添加到单元测试中之外,自动装配构造函数还有其他功能吗?这是进行依

  • 下面是关于Seth Ladd博客“Dart”中工厂构造器的使用-试图理解“工厂”构造器值。 在IMHO中,使用通用构造器,可以通过细微的差异实现相同的效果,但非常简单。 如上所示,尽管这两个实例 所以,我的问题是工厂构造函数(或工厂模式)比一般/const构造函数有什么特殊的优点?因为上面的示例代码本身并没有显示工厂构造函数的优点。 谁能解释一下在Dart语言而不是Java / C#中所谓的“工厂

  • 在Dart中,工厂构造函数需要编码器提供更多逻辑,但与常量构造函数没有太大区别,只是它们允许“非最终”实例变量。 与const Constructor相比,它们有哪些优点? 谢谢大家。 编辑 下面是关于Seth Ladd博客“Dart-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。 恕我直言,使用通用构造函数,可以通过细微的差异实现相同的效果,但相当简单。 如上所示,尽管这两个实例 所以,

  • 我创建了以下代码: 如果我没有像预期的那样在main.cpp中包含iostream头文件,则无法识别STD::Cout。我的问题是:如果不包括iostream,为什么在quote.h中使用std::oStream没有问题?。在前面提到的库中,将cout定义为ostream,为什么cout的使用是一个问题而ostream不是? 我使用VS2017,以防这些信息很重要。