2011-06-23 58 views
3

我正在編寫一個C++程序,我需要一些幫助來理解錯誤。ostream/ofstream繼承問題

默認情況下,我的程序打印到終端(標準輸出)。但是,如果用戶提供文件名,程序將打印到該文件。如果我正在寫入終端,我將使用std::cout對象,而如果我正在寫入文件,我將創建並使用std::ofstream對象。

但是,我不想不斷地檢查是否應該這樣寫入終端或文件。由於std::coutstd::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)’ 

任何想法爲什麼我得到這些錯誤?我是否編寫了錯誤的代碼,或者我的方法存在根本性錯誤?

謝謝!

回答

6

流不可複製,因此您不能通過值將它們傳遞給函數。改爲使用參考。

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

哇,這很簡單。謝謝! –

4

您不能複製流。因此,您需要通過參考:

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