2011-06-23 28 views
3

私はC++プログラムを作成していますが、エラーを理解する助けが必要です。ostream/ofstream継承の問題

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

しかし、端末やファイルに書き込むことになっているかどうかを絶えず確認する必要はありません。 std::coutstd::ofstreamオブジェクトの両方がstd::ostreamクラスを継承しているので、私はstd::ostreamオブジェクトを受け入れるような種類のprint_output関数を作成すると考えました。この関数を呼び出す前に、ファイルに出力するかどうかを確認します。もしそうなら、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); 
    } 
} 

...ここではコンパイル時エラーです。

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

なぜこれらのエラーが表示されますか?私は何か間違ったコードを書いていたのですか、私のアプローチに根本的に何か間違っていますか?

ありがとうございます!

答えて

6

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

void print_something(std::ostream& outstream); 
+0

うわー、それは簡単でした。ありがとう! –

4

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

void print_something(std::ostream & outstream) 
          // ^^^ pass by reference.