【问题标题】:Pass std::istream and std::ostream by reference to be used from within function通过引用传递 std::istream 和 std::ostream 以在函数内使用
【发布时间】:2020-12-24 15:05:44
【问题描述】:

我正在尝试使用以下功能:

void f(std::istream& input, std::ostream& output) {
    int n;
    output << "enter a number: ";
    input >> n;
}

int main() {
    std::istream is;
    std::ostream os;
    f(is, os);
    return 0;
}

错误:

'std::basic_istream<_CharT, _Traits>::basic_istream()

完全错误这是我在调试和编译时遇到的整个错误,

c:\Users\root\Documents\cpp\main.cpp: In function 'int main()':
c:\Users\root\Documents\cpp\main.cpp:40:18: error: 'std::basic_istream<_CharT, _Traits>::basic_istream() 
[with _CharT = char; _Traits = std::char_traits<char>]' is protected within this context
   40 |     std::istream in;
      |                  ^~
In file included from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\iostream:40,
                 from c:\Users\root\Documents\cpp\main.cpp:7:
c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\istream:606:7: note: declared protected here
  606 |       basic_istream()
      |       ^~~~~~~~~~~~~
c:\Users\root\Documents\cpp\main.cpp:41:18: error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() 
[with _CharT = char; _Traits = std::char_traits<char>]' is protected within this context
   41 |     std::ostream out;
      |                  ^~~
In file included from c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\iostream:39,
                 from c:\Users\root\Documents\cpp\main.cpp:7:
c:\mingw\lib\gcc\mingw32\9.2.0\include\c++\ostream:390:7: note: declared protected here
  390 |       basic_ostream()
      |       ^~~~~~~~~~~~~

f(std::cin, std::cout) 导致以下错误:

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

【问题讨论】:

  • 这不是错误消息。请包含完整的消息
  • 函数f 看起来不错。但是在main 中,您不能默认构造这样的流。你到底想做什么?
  • @cigien,我正在尝试使用我编写的函数。 !
  • 好吧,打电话给f(std::cout, std::cin);怎么样?
  • @cigien,我最初考虑过这一点,但不太确定它会如何工作。从我的脑海中说出来。

标签: c++


【解决方案1】:

查看std::istream constructorstd::ostream constructor 以及示例。

你想这样做:

#include<iostream>

void f(std::istream& input, std::ostream& output)
{
    int n;
    output << "enter a number: ";
    input >> n;
}

int main()
{
    f(std::cin, std::cout);
    return 0;
}

Demo

而不是这个:

void f(std::istream& input, std::ostream& output)
{
    int n;
    output << "enter a number: ";
    input >> n;
}

int main()
{
    std::istream is;   // Note: not linked to console
    std::ostream os;   // Note: not linked to console
    f(is, os);
    return 0;
}

错误信息是因为你无法访问std::istreamstd::ostream的默认构造函数,它是受保护的:

basic_istream:

protected:
  basic_istream()
  : _M_gcount(streamsize(0))
  { this->init(0); }

basic_ostream:

protected:
  basic_ostream()
  { this->init(0); }

【讨论】:

  • f(std::cin, std::cout) 结果 => terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid
  • 代码可以编译,之前也是这样,但是抛出了我上面写的错误。
  • 是的,我明白那部分。那么,我如何使用 istream 和 ostream 来获取输入并将其推送到带有 ostream 的控制台?
  • @JohnSmith std::cin 和 std::cout。这就是您必须使用的 ostream 和 istream 的实例。我知道没有操作系统支持每个进程多个控制台,并且它已经打开,C++ 将它与这些流相关联
  • @JohnSmith 为什么你不想使用 std::cout 或 std::cin,我之前没有尝试过覆盖 std::cout 或 std::cin。见thisthis
猜你喜欢
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 2014-04-12
  • 1970-01-01
  • 2013-11-09
  • 2011-02-22
  • 2015-11-01
相关资源
最近更新 更多