5

C++ プログラムを書いていますが、エラーを理解するための助けが必要です。

デフォルトでは、私のプログラムは端末 (STDOUT) に出力します。ただし、ユーザーがファイル名を指定すると、プログラムはそのファイルに出力します。端末に書き込む場合はstd::coutオブジェクトを使用しますが、ファイルに書き込む場合はオブジェクトを作成して使用しstd::ofstreamます。

ただし、端末またはファイルに書き込む必要があるかどうかを継続的に確認する必要はありません。std::coutとオブジェクトの両方がクラスstd::ofstreamから継承されるため、オブジェクトを受け入れるstd::ostream一種の関数を作成することにしました。この関数を呼び出す前に、ファイルに出力する必要があるかどうかを確認します。その場合は、オブジェクトを作成して print 関数に渡します。そうでない場合は、単純に print 関数に渡します。印刷機能は、印刷先を気にする必要はありません。print_outputstd::ostreamstd::ofstreamstd::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)’

これらのエラーが発生する理由について何か考えはありますか? 何か間違ったコードを書いたのでしょうか、それとも私のアプローチに根本的な問題がありますか?

ありがとう!

4

2 に答える 2

7

ストリームはコピーできないため、値で関数に渡すことはできません。代わりに参照を使用してください。

void print_something(std::ostream& outstream);
于 2011-06-23T16:39:12.980 に答える
5

ストリームをコピーすることはできません。結果として、あなたは参照によって渡す必要があります:

void print_something(std::ostream & outstream)
                             //  ^^^  pass by reference.
于 2011-06-23T16:40:23.413 に答える