ostream/ofstream继承问题

Dan*_*age 4 c++ copy reference ofstream ostream

我正在编写一个C++程序,我需要一些帮助来理解错误.

默认情况下,我的程序打印到终端(STDOUT).但是,如果用户提供文件名,程序将打印到该文件.如果我正在写终端,我将使用该std::cout对象,而如果我正在写一个文件,我将创建并使用一个std::ofstream对象.

但是,我不想不断检查我是否应该这样写入终端或文件.由于两个std::coutstd::ofstream对象都继承自std::ostream类,我想我会创建一种print_output接受std::ostream对象的函数.在调用此函数之前,我会检查是否应该打印到文件.如果是这样,我将创建std::ofstream对象并将其传递给print函数.如果没有,我将简单地传递std::cout给打印功能.然后打印功能不必担心打印到何处.

我认为这是一个好主意,但我无法获得编译代码.我在这里创建了一个过于简化的例子.这是代码......

#include <fstream>
#include <iostream>
#include <stdio.h>

void print_something(std::ostream outstream)
{
  outstream << "All of the output is going here\n";
}

int main(int argc, char **argv)
{
  if(argc > 1)
  {
    std::ofstream outfile(argv[1]);
    print_something(outfile);
  }
  else
  {
    print_something(std::cout);
  }
}
Run Code Online (Sandbox Code Playgroud)

...这是编译时错误.

dhrasmus:Desktop standage$ g++ -Wall -O3 -o test test.c 
/usr/include/c++/4.2.1/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2.1/bits/ios_base.h:779: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
/usr/include/c++/4.2.1/iosfwd:55: error: within this context
/usr/include/c++/4.2.1/iosfwd: In copy constructor ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’:
/usr/include/c++/4.2.1/iosfwd:64: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here 
test.c: In function ‘int main(int, char**)’:
test.c:15: note: synthesized method ‘std::basic_ostream<char, std::char_traits<char> >::basic_ostream(const std::basic_ostream<char, std::char_traits<char> >&)’ first required here 
test.c:15: error:   initializing argument 1 of ‘void print_something(std::ostream)’
Run Code Online (Sandbox Code Playgroud)

关于我为什么会收到这些错误的任何想法?我编写了错误的代码,或者我的方法是否存在根本性的错误?

谢谢!

Cat*_*lus 7

流不可复制,因此您无法按值将它们传递给函数.请改用参考.

void print_something(std::ostream& outstream);
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 5

您无法复制流。因此,您需要通过引用传递:

void print_something(std::ostream & outstream)
                             //  ^^^  pass by reference.
Run Code Online (Sandbox Code Playgroud)