Проблема с наследованием ostream/ofstream

Я пишу программу на C++, и мне нужна помощь в понимании ошибки.

По умолчанию моя программа выводит на терминал (STDOUT). Однако, если пользователь укажет имя файла, программа будет печатать в этот файл. Если я пишу в терминал, я буду использовать объект std::cout, а если я пишу в файл, я создам и использую объект std::ofstream.

Однако я не хочу постоянно проверять, должен ли я писать в терминал или в файл. Поскольку объекты std::cout и std::ofstream наследуются от класса std::ostream, я решил создать своего рода функцию print_output, которая принимает объект std::ostream. Перед вызовом этой функции я бы проверил, должен ли я печатать в файл. Если это так, я создам объект std::ofstream и передам его функции печати. Если нет, я просто передам 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);
  }
}

... и вот ошибка времени компиляции.

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)’

Любые идеи относительно того, почему я получаю эти ошибки? Я что-то неправильно закодировал или что-то принципиально неправильное в моем подходе?

Спасибо!


person Daniel Standage    schedule 23.06.2011    source источник


Ответы (2)


Потоки не копируются, поэтому вы не можете передать их функции по значению. Вместо этого используйте ссылку.

void print_something(std::ostream& outstream);
person Cat Plus Plus    schedule 23.06.2011
comment
Вау, это было просто. Спасибо! - person Daniel Standage; 23.06.2011

Вы не можете копировать поток. В результате вам нужно пройти по ссылке:

void print_something(std::ostream & outstream)
                             //  ^^^  pass by reference.
person Martin York    schedule 23.06.2011